@neurodyn/react-room-viewer 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -53,6 +53,11 @@ declare const resources: {
53
53
  readonly scanQrCode: "Scan this QR code with your phone's camera to view the object in Augmented Reality";
54
54
  readonly deviceRequirementsDisclaimer: "*Requires AR-supported device and browser. We recommend iOS 12 or later with Safari, or Android 7.0 or later with Chrome.";
55
55
  };
56
+ readonly legal: {
57
+ readonly termsOfUse: "Terms of Use";
58
+ readonly conjunction: "and";
59
+ readonly privacyPolicy: "Privacy Policy";
60
+ };
56
61
  readonly shareMessage: {
57
62
  readonly wallart: "Preview wall art";
58
63
  readonly rugs: "Preview rug";
@@ -161,6 +166,11 @@ declare const resources: {
161
166
  readonly scanQrCode: "Отсканируйте этот QR-код камерой телефона, чтобы просмотреть объект в дополненной реальности";
162
167
  readonly deviceRequirementsDisclaimer: "*Требуется устройство и браузер с поддержкой AR. Рекомендуем iOS 12 или новее с Safari либо Android 7.0 или новее с Chrome.";
163
168
  };
169
+ readonly legal: {
170
+ readonly termsOfUse: "Условия использования";
171
+ readonly conjunction: "и";
172
+ readonly privacyPolicy: "Политика конфиденциальности";
173
+ };
164
174
  readonly shareMessage: {
165
175
  readonly wallart: "Примерить настенный декор";
166
176
  readonly rugs: "Примерить ковер";
package/dist/index.js CHANGED
@@ -21,9 +21,9 @@ import { formatHex, oklch } from "culori";
21
21
  import qrcode from "qrcode";
22
22
  import { GLTFExporter, USDZExporter } from "three/examples/jsm/Addons.js";
23
23
  import "@google/model-viewer";
24
- import { Clone, DragControls, Environment, useGLTF, useProgress } from "@react-three/drei";
24
+ import { Clone, DragControls, Environment, useGLTF, useProgress, useTexture } from "@react-three/drei";
25
25
  import { Canvas, useLoader, useThree } from "@react-three/fiber";
26
- import { ACESFilmicToneMapping, BufferGeometry, ClampToEdgeWrapping, DoubleSide, Float32BufferAttribute, LinearFilter, MathUtils, Matrix4, NearestFilter, PerspectiveCamera, Quaternion, SRGBColorSpace, TextureLoader, Vector2, Vector3 } from "three";
26
+ import { ACESFilmicToneMapping, Box3, BufferGeometry, ClampToEdgeWrapping, DoubleSide, Float32BufferAttribute, LinearFilter, MathUtils, Matrix4, NearestFilter, PerspectiveCamera, Plane, Quaternion, SRGBColorSpace, TextureLoader, Vector2, Vector3 } from "three";
27
27
  import { Indicator as react_radio_group_Indicator, Item, Root as react_radio_group_Root } from "@radix-ui/react-radio-group";
28
28
  import { Swiper, SwiperSlide } from "swiper/react";
29
29
  var __webpack_modules__ = {
@@ -3029,6 +3029,14 @@ var __webpack_modules__ = {
3029
3029
  font-variant-numeric: tabular-nums;
3030
3030
  }
3031
3031
 
3032
+ .underline {
3033
+ text-decoration-line: underline;
3034
+ }
3035
+
3036
+ .underline-offset-2 {
3037
+ text-underline-offset: 2px;
3038
+ }
3039
+
3032
3040
  .underline-offset-4 {
3033
3041
  text-underline-offset: 4px;
3034
3042
  }
@@ -6595,6 +6603,11 @@ const ns1 = {
6595
6603
  scanQrCode: 'Scan this QR code with your phone\'s camera to view the object in Augmented Reality',
6596
6604
  deviceRequirementsDisclaimer: '*Requires AR-supported device and browser. We recommend iOS 12 or later with Safari, or Android 7.0 or later with Chrome.'
6597
6605
  },
6606
+ legal: {
6607
+ termsOfUse: 'Terms of Use',
6608
+ conjunction: 'and',
6609
+ privacyPolicy: 'Privacy Policy'
6610
+ },
6598
6611
  shareMessage: {
6599
6612
  wallart: 'Preview wall art',
6600
6613
  rugs: 'Preview rug',
@@ -6702,6 +6715,11 @@ const ns1_ns1 = {
6702
6715
  scanQrCode: 'Отсканируйте этот QR-код камерой телефона, чтобы просмотреть объект в дополненной реальности',
6703
6716
  deviceRequirementsDisclaimer: '*Требуется устройство и браузер с поддержкой AR. Рекомендуем iOS 12 или новее с Safari либо Android 7.0 или новее с Chrome.'
6704
6717
  },
6718
+ legal: {
6719
+ termsOfUse: 'Условия использования',
6720
+ conjunction: 'и',
6721
+ privacyPolicy: 'Политика конфиденциальности'
6722
+ },
6705
6723
  shareMessage: {
6706
6724
  wallart: 'Примерить настенный декор',
6707
6725
  rugs: 'Примерить ковер',
@@ -8697,12 +8715,16 @@ const config_env = {
8697
8715
  NODE_API_BASE_URL: "https://api.neurodyn.ai/",
8698
8716
  TENANTS: {
8699
8717
  arizo: {
8718
+ PRIVACY_URL: 'https://arizo.ru/privacy-policy/',
8700
8719
  POSTER_URL: "https://viewer.arizo.ru/poster/app/index.html",
8701
- ROOM_URL: "https://viewer.arizo.ru/room-viewer"
8720
+ ROOM_URL: "https://integrations.arizo.ru/room-viewer",
8721
+ TERMS_URL: 'https://arizo.ru/terms-of-use/'
8702
8722
  },
8703
8723
  vizbl: {
8724
+ PRIVACY_URL: 'https://vizbl.com/legal/privacy-policy',
8704
8725
  POSTER_URL: "https://viewer.vizbl.com/poster/app/index.html",
8705
- ROOM_URL: "https://integrations.vizbl.com/room-viewer"
8726
+ ROOM_URL: "https://integrations.vizbl.com/room-viewer",
8727
+ TERMS_URL: 'https://vizbl.com/legal/terms-of-use'
8706
8728
  }
8707
8729
  },
8708
8730
  APP_CLIP_BUNDLE_ID: "com.us.vizbl.Clip"
@@ -9455,7 +9477,11 @@ function AR({ className, buttonClassName, buttonLeadingIcon, buttonLabel, button
9455
9477
  const handleClick = async ()=>{
9456
9478
  if ('floor' === placement) {
9457
9479
  if (!tinuuid) return;
9458
- if (isIOS && appClipUrl) return void window.location.assign(appClipUrl);
9480
+ if (isIOS && appClipUrl) {
9481
+ sendWidgetEvent(widgetSession, 'appclip');
9482
+ window.location.assign(appClipUrl);
9483
+ return;
9484
+ }
9459
9485
  await refreshHandoffWidgetSessionToken();
9460
9486
  setOpen(true);
9461
9487
  return;
@@ -9542,9 +9568,37 @@ function AR({ className, buttonClassName, buttonLeadingIcon, buttonLabel, button
9542
9568
  className: "text-lg text-center text-text-sub font-medium",
9543
9569
  children: t('ar.scanQrCode')
9544
9570
  }),
9545
- /*#__PURE__*/ jsx_runtime_jsx("p", {
9571
+ /*#__PURE__*/ jsxs("p", {
9546
9572
  className: "text-xs text-center text-text-light",
9547
- children: t('ar.deviceRequirementsDisclaimer')
9573
+ children: [
9574
+ t('ar.deviceRequirementsDisclaimer'),
9575
+ /*#__PURE__*/ jsx_runtime_jsx("br", {}),
9576
+ /*#__PURE__*/ jsx_runtime_jsx("a", {
9577
+ href: tenantConfig.TERMS_URL,
9578
+ target: "_blank",
9579
+ rel: "noopener noreferrer",
9580
+ className: "underline underline-offset-2 transition-colors duration-300 hover:text-text-dark",
9581
+ style: {
9582
+ textDecoration: 'underline',
9583
+ textUnderlineOffset: '2px'
9584
+ },
9585
+ children: t('legal.termsOfUse')
9586
+ }),
9587
+ ' ',
9588
+ t('legal.conjunction'),
9589
+ ' ',
9590
+ /*#__PURE__*/ jsx_runtime_jsx("a", {
9591
+ href: tenantConfig.PRIVACY_URL,
9592
+ target: "_blank",
9593
+ rel: "noopener noreferrer",
9594
+ className: "underline underline-offset-2 transition-colors duration-300 hover:text-text-dark",
9595
+ style: {
9596
+ textDecoration: 'underline',
9597
+ textUnderlineOffset: '2px'
9598
+ },
9599
+ children: t('legal.privacyPolicy')
9600
+ })
9601
+ ]
9548
9602
  }),
9549
9603
  /*#__PURE__*/ jsx_runtime_jsx(DialogClose, {
9550
9604
  asChild: true,
@@ -9723,14 +9777,34 @@ async function canvasToPngBlob(canvas, errorMessage) {
9723
9777
  }, 'image/png');
9724
9778
  });
9725
9779
  }
9780
+ function hideSceneCaptureExclusions(scene) {
9781
+ const previousVisibility = new Map();
9782
+ scene.traverse((object)=>{
9783
+ if (true === object.userData.excludeFromCapture) {
9784
+ previousVisibility.set(object, object.visible);
9785
+ object.visible = false;
9786
+ }
9787
+ });
9788
+ return ()=>{
9789
+ previousVisibility.forEach((visible, object)=>{
9790
+ object.visible = visible;
9791
+ });
9792
+ };
9793
+ }
9726
9794
  function CanvasCaptureBridge({ ref }) {
9727
9795
  const { camera, gl, invalidate, scene } = useThree();
9728
9796
  useImperativeHandle(ref, ()=>({
9729
9797
  capture: async ()=>{
9730
9798
  invalidate();
9731
9799
  await new Promise((resolve)=>requestAnimationFrame(()=>resolve()));
9732
- gl.render(scene, camera);
9733
- return canvasToPngBlob(gl.domElement, 'Failed to create scene share image');
9800
+ const restoreVisibility = hideSceneCaptureExclusions(scene);
9801
+ try {
9802
+ gl.render(scene, camera);
9803
+ return await canvasToPngBlob(gl.domElement, 'Failed to create scene share image');
9804
+ } finally{
9805
+ restoreVisibility();
9806
+ invalidate();
9807
+ }
9734
9808
  }
9735
9809
  }), [
9736
9810
  camera,
@@ -9766,6 +9840,17 @@ function createPoseFromPlane(mesh, point, camera, placement) {
9766
9840
  activePlaneId: mesh.userData.planeId
9767
9841
  };
9768
9842
  }
9843
+ function createPointerDragOffset(resourcePose, pointerPose) {
9844
+ const inverseSurfaceQuaternion = new Quaternion(...pointerPose.quaternion).invert();
9845
+ return new Vector3(...resourcePose.position).sub(new Vector3(...pointerPose.position)).applyQuaternion(inverseSurfaceQuaternion).toArray();
9846
+ }
9847
+ function applyPointerDragOffset(pointerPose, offset) {
9848
+ const position = new Vector3(...offset).applyQuaternion(new Quaternion(...pointerPose.quaternion)).add(new Vector3(...pointerPose.position));
9849
+ return {
9850
+ ...pointerPose,
9851
+ position: position.toArray()
9852
+ };
9853
+ }
9769
9854
  function isRoomScenePlaneAllowedForResource(plane, placement) {
9770
9855
  return 'floor' === placement ? 'floor' === plane.kind : 'floor' !== plane.kind;
9771
9856
  }
@@ -9846,6 +9931,7 @@ function useRoomScenePlacement({ camera, invalidate, pointer, raycaster, roomId,
9846
9931
  const [placementState, dispatchPlacementState] = useReducer(reduceRoomScenePlacementState, placementKey, createInitialRoomScenePlacementState);
9847
9932
  const activePlaneIdRef = useRef(null);
9848
9933
  const planeMapRef = useRef(new Map());
9934
+ const pointerDragOffsetRef = useRef(null);
9849
9935
  const planeIdMap = placementState.placementKey === placementKey ? placementState.planeIdMap : null;
9850
9936
  const resourcePose = placementState.placementKey === placementKey ? placementState.resourcePose : null;
9851
9937
  const allowedPlanes = external_react_useMemo(()=>getAllowedRoomScenePlanes(scene, placement), [
@@ -9899,12 +9985,14 @@ function useRoomScenePlacement({ camera, invalidate, pointer, raycaster, roomId,
9899
9985
  });
9900
9986
  activePlaneIdRef.current = null;
9901
9987
  activePlaneIdUniform.value = 0;
9988
+ pointerDragOffsetRef.current = null;
9902
9989
  }, [
9903
9990
  activePlaneIdUniform,
9904
9991
  placementKey
9905
9992
  ]);
9906
- const updatePoseFromPlane = useCallback((mesh, point)=>{
9907
- const pose = createPoseFromPlane(mesh, point, camera, placement);
9993
+ const updatePoseFromPlane = useCallback((mesh, point, pointerDragOffset = null)=>{
9994
+ const pointerPose = createPoseFromPlane(mesh, point, camera, placement);
9995
+ const pose = pointerDragOffset ? applyPointerDragOffset(pointerPose, pointerDragOffset) : pointerPose;
9908
9996
  activePlaneIdRef.current = pose.activePlaneId;
9909
9997
  activePlaneIdUniform.value = pose.activePlaneId;
9910
9998
  dispatchPlacementState({
@@ -9964,17 +10052,37 @@ function useRoomScenePlacement({ camera, invalidate, pointer, raycaster, roomId,
9964
10052
  resourcePose,
9965
10053
  placement
9966
10054
  ]);
10055
+ const handleDragStart = useCallback(()=>{
10056
+ const hit = findHitForPointer(pointer);
10057
+ if (!hit || !resourcePose) {
10058
+ pointerDragOffsetRef.current = null;
10059
+ return;
10060
+ }
10061
+ const pointerPose = createPoseFromPlane(hit.object, hit.point, camera, placement);
10062
+ pointerDragOffsetRef.current = createPointerDragOffset(resourcePose, pointerPose);
10063
+ }, [
10064
+ camera,
10065
+ findHitForPointer,
10066
+ placement,
10067
+ pointer,
10068
+ resourcePose
10069
+ ]);
9967
10070
  const handleDrag = useCallback(()=>{
9968
10071
  const hit = findHitForPointer(pointer);
9969
- if (hit) updatePoseFromPlane(hit.object, hit.point);
10072
+ if (hit) updatePoseFromPlane(hit.object, hit.point, pointerDragOffsetRef.current);
9970
10073
  }, [
9971
10074
  findHitForPointer,
9972
10075
  pointer,
9973
10076
  updatePoseFromPlane
9974
10077
  ]);
10078
+ const handleDragEnd = useCallback(()=>{
10079
+ pointerDragOffsetRef.current = null;
10080
+ }, []);
9975
10081
  return {
9976
10082
  activePlaneIdUniform,
9977
10083
  handleDrag,
10084
+ handleDragEnd,
10085
+ handleDragStart,
9978
10086
  planeGeometries,
9979
10087
  readiness,
9980
10088
  resourcePose,
@@ -10091,16 +10199,128 @@ function collectClonedMaterials(source) {
10091
10199
  });
10092
10200
  return Array.from(materials);
10093
10201
  }
10202
+ const arrows_ruginline_namespaceObject = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMS1jMDAyIDc5LmI3YzY0Y2NmOSwgMjAyNC8wNy8xNi0xMjozOTowNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI2LjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjYxMUY4MDQ3RTJDMTFGMTlCMkNBN0Y1RDJDNzNDQzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjYxMUY4MDU3RTJDMTFGMTlCMkNBN0Y1RDJDNzNDQzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCNjExRjgwMjdFMkMxMUYxOUIyQ0E3RjVEMkM3M0NDNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCNjExRjgwMzdFMkMxMUYxOUIyQ0E3RjVEMkM3M0NDNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiAtRloAAIYkSURBVHja7N0HvJ1FtTfgOekJLUDoRaR3EKQXEUG4WJAOAlIUARGw94rez3ZFvHopUhRFkSIqCChNepOOCApIEQHppPfzrcnMISfUlFN2eZ77+9+dHAKStTdJZr1rZjo6OzsTAMCr2CZyRGRC5FORp5QEAJrXICUAAF5mk8gnInt2vvBs6ph/wfgTw+B74vvfURoAaF4DlAAAqDaKnBm5dvqYF/Yc88vj0lNf2Cd1Tp6Y/9r8ygMAzc0EAACwbuSzKT/xHz9m0PhLz04v/u7UNPlvN6QhK6yT0oCB+cdMVyYA0AAAAJrTqpEjIwd3jhs9Ii/8R5//0zT5gRtSx5AF08AFF00dg4eoEgBoAAAATWqluvA/qHPKpAUnXPHb9OI5x6fJ/7h2xsJ/wPxLlR81ZYJKAYAGAADQhJZL5XC/gzunTV1w4rUXptHnnpQm3vnH1DF4/hkL/3w3UL4gqKMj/3BHBQGABgAA0EyWiBwSOTIW/otPvOYPacxvT04T7rwsdQwY/NIT/7z4n7Hu71AwANAAAACayai68P9IZNlJN12aXjjrx2nibX+Mhf+ANGDEqPLEv675u9b9nfW1w7l/AKABAAA0tIUih0eOyAv/yXdcO2PUf/wN58XqfnrqGD6qjvh3xP91vuJv7nipCTDLFoBpygoAGgAAQN8YUH/vHlpfB0fyHX1D6ro9fz8f8PfDNHXKqpPuuiGNPe+UNO7GP6Q0dWxKwxeNhf+Abkv+8uy/c8am/1kn//O3p3fMMgGwaGSp+jdNjkyNTKmZ6q0BAA0AAGh3HXXB3pX5IiMjC9YskMoT+/nq68huPya/zl8zoi7wB79OA+AlY889IT3zo6NnLM0HLLx46hiyWLfR/q7/37UB4JU6X/nloyKH5r7Ayxb+k2smRcZExnV7fbF+u+t1dLfXruS/NrH+/RPrPx8A0AAAgIZZ1OfF+yJ10b5wmvmEfImaUfXri9TF/EL173kj4+pCeHx9nVDzfLevjamvE+tCfFxdOI+p/5sfne+9B40csNgyafRvTkqT7rkqfscfmtLQBWYe9Nf9J1O/0P2v5a91zNoEuDJyfWR4bUYMq98eXpsYQ+q3889xpfrXR9SvvdGfN8bXRsAL3fJM5KnIfyJP1nT9mOfr6xQfRQCYgz/AdHZ2qgIAzDR/t0X9spGla5aMvKm+LpNmPpl/+Xp6el3QjqsL1acjz9UF7bN14fpcXay/UBe1o+uPn1STF7ZdT9bnZu/9ypEjIwd1Tp64wPjLzkmjzz0xTX7ghhnX/XUMXSB13+nfffE/S4NgyqQ0aIkV0pKnXJ06ho34Ynzl/81mcyQ3AwbX15yhtSGQazpft8bJAvXbi9bXUfXbi9UfN1/957zchFqv3CB4LPJ45N+1WfCv+rWnu9XYVAEAaAAA0IbyonLxuqhfqi7qV4y8uS7su57gv9ykNPOJdH59otui87Fui/kXuy3q+/vgvNUjn4zs2zlu9PAJl5+bXvz9aWny/denAUNGps7Bw1/x9H+WbQKzNgCOia98ta/+fJJmbonoysj6vixVGzNL1kbBEvV14Vf55+T34cn6Hj0c+WfN4zVPNsj7BAAaAAAwlxati/y8oF8tskpd4OeF/gqpPLnvbmwqT+efqAvFh+qi/om6SHyiLhS7RvCbzYaRT0T26Bw/dvD4S86ccSvA5EdvS2nYIqkjbw9Is44yzGgI9F8DYE7k7QVdWw+WSLM2d7re8+VSmTBY5GV/b560yBMDD0Yeqa/31fc/TxDkRo8DDgHQAACAftY1Sp73m69cF/lr19cl0qz77TvrQv6ButB7qC72Hq6LvK7x/FYfFd8olYmA3ae/+NzAcRf8NI0+/7Q09fG/pTRi0TRg0NAZh//lqYAZr1MnpEFLrNjoDYDZlT8PXVsMuqY+uhpC+XX5VLYqdJlcPzOPRqJA6a/1s/OPVBpCL/pPEAANAADoWXnv+LJ1gbZmZL3IqqmMty/+skV+XqzlJ7p/j9xdF2xde8LziP4k5Zxhk8jnIztPe/rfafxFZ6TRF5+Rpj5+T+oYvkjqGFjXwVMmpEGLr5iWPLUlGgCvJ9+kkKdClq6fs+Xq52vt2izI35+v248fWz9juaGUJwbuSqWp9FD9nAGABgAAvI58x31+cp/Htteti/0N62J/VLcflw9/+3dd4Ocns/mJ7P11kf+MRf4c2TGViYDtpj3zRBp3/k/TmAtPT1Ofvj91DB+VOqZPbaUJgLn+s1IqUwOj6mdxjfq6Vn3tfvbAmNoEuKN+Nu+qDYJ8BsF4HzcANAAAaEf5ZPf8pDU/Zc1P9N9av716mrkVfUq3xX1e7N+WZo7ve8ras3aqjYBtpz3xcBp73slp9B/PSNOefjQNWXG9tNRp17dzA+D1DKuf4+VrY+At9TOcmwPdt6DkhlWeGLg9cmvk3lSmB8YqIQAaAAC0kiHdFkgbd1vwL9Xtx/ynLpBuSWWvdU4+rT1fo+cKt77znshnI1tMffjeNOa8k9OEu25ISx1/aeoYMf834+tfVqLZslD9fK9Vk89eyNsJ8laCgfXH5MV/nhC4o37uc/J2Fc0tADQAAGgKeXGzZF3k56ehm6Uyzr9ctx+Tn4beWhc/N6fyhD8/2Z+gfA0hn6q/VyoTAW+Z+vjDadBiy6Q0ePCX4vv/rTzzJDfC8oGDeWvL+vW/jdwYGFD/+nOpTAfcVBsCeWIgn2th+wAAGgAA9Lt8cNrqdUGzeSpPOtfo9tfzE838NP/auuC/pzYAJitdw8uTG3tHjkxlb/vBqdyaQM9arP43kxsBW9bGQPetMHk6JjfMboxcl8qZAo8rGwAaAAD0tjzWnJ/ubxrZKpWn/F2HoOWR5jtTeaqfFyp5335+ejlR2Zr7zwqp3LBA38kTM6vW/87ydpk8SbNE/Wv5kMt8NsbVtSmQ/3t7OGmqAaABAMA8Lvzyifz5ieTbU3nC/5Y088nkg6mMKV+VyqhyHl12Nzr0vCG1IZCnBHLjLZ+lsUGauXUgn5dxU20K5IZAvoFA4w0ADQAAXteKdXGxTc1q9etT66Liz6k8dfxLKuP9njpC/8hnbaxb/3vNDbru0zjP1GZAV/IBm84RAEADAKDNrVAXENu+yoI/P1HMe/evTGUf/2PKBQ0rXzuYzxLYIvK2+rpo/WtPpDIZcEnk+lSmdSYpGYAGAACtLT81zCP920XeUb+d5Sf5t0Uur4v+fOjY08oFTWtEKlsGNqv/vecDOrvOEcjNvDwZ8MfaGPi7cgFoAADQ/Oari4D8hH/HVJ72D6t/Ld8/flnkilQO73OyOLSufGNHnhB4e/31YKvaJMjuq82AvMXnhqT5B6ABAEDTyAf35ad+70llFHip+vUHUjmwL48B5/H+R5QK2lY+LyBPAOVJoDwhsEn9ej48ME8B/SmV7T+5OThFuQA0AABoDPkp3gb1D/LvSmXUN8t3t+fr+C5O5Sn/3/1BHngNy6Zy08c7IzvU72f/qs2Ai1I5P+A/SgWgAQBA38p7+bdM5Sl/fnq3dP16PqzvkvqH9Xw133NKBcyhfO1gvmFgm8i7U9kukK8cnJDKdMDvU5kOyDeD+IMkgAYAAL0g3wOen8y9t/7BfFAqV3tdEzk/lf27+Sn/dKUCelBuMG6ayoRRnhDomg64O3JB5MJUGo4TlApAAwCAudP1FC4f3rd7ZL369SdTObArP4XLB3YZyQX6Sj5EdIPaCNg5zbxJJB8i+of661LeevSiUgFoAADwxov+DSO7Rt4XWbl+PY/256ds+WlbvqJvolIBDWD12gzI25G2SWUy6flUtiKdm8rBo24VANAAAKDK13Plw7feW/8QvXz9+vV1wZ/389+lTECDW6o2A95bX/OvbXlbQD5E8He1KfCEMgFoAAC0m3xyf76qL4/275xmXtV3deTs+gfmB5QJaFKLpnJ4YP41Lp8dMDIyOXJp/TXu8si/lQlAAwCgVeXx/nyQ1h6R3eqiPx/Yl6/oO6f+wfghZQJaTF78b1l/3XtPbQ5MS+UskzNqM8A2AQANAICmNzCVJ/271D/8vql+/crIr+sfgB9RJqBNLBTZOs2cfsrfH5vKAYJ5MiA3RB0gCKABANBU1q5/uH1/ZM36tXxd31l10f+gEgFtbuFUtgnkqah8bsCCkeciv6m/VuZzUFwtCKABANCQ8t3Yebx1n/qH2uyOyK9SuRrrH0oE8KoWSeXK09w03SGV2wQei5yZymTALUoEoAEA0N/yE6vtIh+I7BQZnMrT/Xz91a9rAwCA2bdc5N2R/VK5ISW7PZVm6nmRfyoRgAYAQF/K+/rzk6q9I6NS2bPatejPJ/lPViKAeZa3U+1Wf61dvX4tnxeQDw+8ODJaiQA0AAB6w5tT2ad6cGTd+rV8evWpqdxv/awSAfSKvCUgTwPsG9kzlZsFnknlrIBfRG5SIgANAIB5NTyyTeTAVE6tHhC5L/LzVA6qsq8foG/lwwN3rL8uv7N+LW8ROK3+uvyEEgFoAADMiVVTedJ0UCr7USemMt6fnzTlEf+pSgTQ71ZJ5eDV/eq3J0XOifwscpVfqwE0AABey7BUniYdksoBVFm+hio/Vcp7Tv+jRAANKW8ReHsqW7TymQH5QNb7aiMgN28fUSIADQCAbOVUnvbnPzgun8qBfvmAqTzmf7PyADSVfCVr3rL1ochaqUwB5LMCfhK5JuIPv4AGAECbyU+Lto0cGtm1fu2GyMmR85MD/QCa3cDI2yIfTOUWgXyGy521EXB2KocIAmgAALSwZVIZDz0sskZkbCr7+vOY/y3KA9CSVojslcqkVz7j5cX6a39uBtytPIAGAEBr2TiVcdD9U9nrn58CnZjKidFPKw9AW8hnA/xXmvWsl0vr7wcXpXLgK4AGAECT/kHvXZEjUxn3z34bOSFyRWSaEgG0rTwFdkAqUwGLRR6qvz/8MvK48gAaAADNIf9Bbu+68M/XQuX9/KekMub/D+UBoJuRqZwF85HIhpHxqRwCm5sBdykPoAEA0Jjy05y8t/+gyAKRv0b+N3Ju5HnlAeANbBc5IvK++v0LIj+OXKI0gAYAQGPYMvLxNPM0/3yK/49SGfOfrjwAzKG1IwemclPM/JHbIsencp3gWOUBNAAA+tbQyA6Rz0S2iEyJnJrKic63Kw8APWDxyPtT2VK2YuTRyEn195v/KA+gAQDQu/JezT3qwn/l+gewPOb/q8jDygNAL8hN591qI2DTVK4R/EltBPxdeQANAICetWgqo5hHp/JE5r7I91LZ3z9aeQDoI9tHjkozrxHsmj67WWkADQCAeZNP8T+kJj/9vy7yw1QOZnJfMwD9Zf3IJyP75j9Tp3LN7HcjNyoNoAEAMGfyXsuPpXIt08DIhamM+juJGYBGsloqE2r596u8VeDPkR+k0qgG0AAAeB35DuY8WrlfZEDkN6k8UTFaCUAjWzaVabV8jWDetnZD5P9F/qA0gAYAwKzeGvl0ZM/ItMjpkf9L5eolAGgWoyIfjHwilTNrbop8pzYCpigPoAEAtLONUznRP5+unH9BOiFyXOR+pQGgiS0c+VAqU215OuDO2gg4VyMA0AAA2s3Ln/gfn8rhfg8qDQAtZKFUDgr8VOTNkbsi39YIADQAgHawUSpP/HevC/8T68LfE38AWtnwVJren0/l4ECNAEADAGhZedQ/P/3YIzI9lSf+edTfE38A2km+KWCfyFdSmQi4JfL15LBAQAMAaAH5KcfnIgdGpqayx/9HyRN/ANrbgpH9U5mKWz6VwwLzrQHnKw2gAQA0m5UjH0vlOqQsn+ifn/g/oDQA8JIFIoelci7OYqlcH/jVyKVKA2gAAI1umVSuPsqnHg+K/DLyrcg9SgMAr2nRyMGRT0aWiPwulVsDblQaQAMAaDT5uqPDU3mCMTJyTuR/IjcrDQDMUSMgN9LzuTlDImdFvpE00gENAKAB5MOMDoh8LbJU5KpURhevUhoAmGtvihydyna6jshJqdwa8LDSABoAQH/IV/nlA4tWidyayonGFykLAPSYtVK5OnDfyNhUpuvyTTpPKw0wpwYoATAX3h65NpUx/9xFPDCyqcU/APS4PPq/XyrX6eabAr4WuTOVgwOHKg+gAQD0ljUjZ0euiKyeytVFG0ZOT+WKPwCgd/wlsl1kp8gTqVyre0tkF6UBNACAnrR45AepPIXYLXJsZO3I91IZRwQA+sbFkU0i+0cWipyXypWBWygN8EacAQC8nmGRD0e+nsrJ/mfVb9+rNADQ7/LvzYemcgbPiMipqRwU+IDSABoAwJzII4X5gL886n9NKnsOr1AWAGg4y0e+FDkkMqE2AY6LjFYaoDtbAICX2yCVw/zySGGeAPhAZBuLfwBoWI+mMrG3USpN+zytd0dkb6UBNACAV7NUKvv883V+b69/eHhL5BeR6coDAA0vHwq4QyrX9E6OnBm5LJWbegBsAQDSwMgHI9+MLBb5VSrj/vcrDQA0reGRIyNfTeV8gP+LfCPyH6WB9mUCANrb1qmMCp6Uyvjg9pF9Lf4BoOnlswC+m8oVvvm63iNSOcQ3vw5UHtAAANrHcpHTIlelcsjfR1K5UugypQGAlvJI5MBUtvfdF/lx5Ib6fUADAGhhueOfxwHviRwUOTGyVuSEyDTlAYCWdWVky1Sa/iumcrjvKZFllQbahzMAoH1sFfmfyMaR6yKfi1yrLADQdpZM5bDffHPAC5HPR05OHgZAyzMBAK1viVQO/rk6snLk8FT2/lv8A0B7ejJyaGTzVLYF5EnAK+v3AQ0AoEl9IHJXKuN+ecxv7VTG/l3rBwDkswDytoB8MOC6qUwIHhtZVGlAAwBoHutE/pjKqb+PRbaLHBJ5QmkAgG7y2P/xkfUjv4h8PHJnZC+lAQ0AoLENjXy5/sa9beSLqYzzXa40AMDreCiVycEdI2Mjv46cl8r2QaBFOAQQWkd+yp8P+Vsvcn4qh/zdqywAwBxaIPLpyJciE+qfKfKUgEMCocmZAIDml/fp/TByaSoH/h0Y2dniHwCYS2MiX4lsELk18r+pHB68kdKABgDQf3aL3BE5KvLTVJ7+n64sAEAPyH/GyFsK82HC+SDhmyNfi8ynNKABAPSdZSI/i5wbGR/ZKXJw5CmlAQB60NRUrgnMhwT+JvLVyC21MQBoAAC97MBUOvIHpHJVTx7Hu1hZAIBe9GBk91RuB1g4lQOG89lD8ysNaAAAPW+FVDrvedT/0cjWkU9GRisNANBHzk7lbIBf1j+H5GmA7ZUFNACAnnNQKk/9d418I5Wr/a5RFgCgHzwe2S/yvlTOA7gk8qPISKUBDQBg7q2Qyh28p0UeqAv/fCrvJKUBAPrZ7yNviZwa+Wgq0wDvVBbQAADm3IGR2yO7RL4e2TJyg7IAAA3kmciH6p9XhkT+FPl+cjYANKSOzs5OVYDGslTkB6kcspMbAEdY+AMATWBU5Fu1IXBvKlMBVygLNA4TANBY8h7/W+vi/5uRLSz+AYAmkacBDonsHVkklZsCckNghNKABgAwUz4055RUTvkfG9km8uXIBKUBAJrMWZENI2dEPhe5KpVriwENAGh720Vuinww8uPIxvU3SgCAZvXvyP6pnGm0WuTmyKeUBTQAoF0NTeVKv0tTOSgnX6VzZOQFpQEAWsTpqdwUcHHke5HLakMA6AcOAYT+sVYqV+ZsEvl15OORJ5UFAGhhn4x8JzI+lUOOf6Ek0LdMAEDf+3AqB/2tl8rY/z4W/wBAG8jXA24auT/y88hpqRwWCGgAQMtZMnJ25KTIXyJvrb/xAQC0i1sim0eOjRyUyjlIWysLaABAK/mv+hveHpFjUjn47x5lAQDa0KRUtgPk84/yOUj58ON8+9EgpQENAGhm+Teyb0YuikyJbB/5av2NDwCgnf0+skF9Pab+eenNygK9xyGA0HtWSmXEP4+15YP+joo8rSwAAK9wdCpnBIxJ5bykc5QEep4JAOgdedQ/H/S3ReTwVA76s/gHAHh1P4xsGXkslTOTjosMUxbQAIBGNjzyv/U3rkdTuebvRGUBAHhDN6ZyQODJqUwEXJHK1clAD7EFAHrOmqmM/OdF/08in46MVhYAgDl2YOSEyPRUrk3+tZLAvDMBAD1j38jNkfVTudLmUIt/AIC59rNUHqrcFzkzlS0CtgSABgD0qzzy/4PIGZG/Rzauv2EBADBv7krlMOU8WZkPU/5zZDVlgblnCwDMvVUjP01lr1r+jSnfZztWWQAAetzBkeNTuVY5T1ueqyQw50wAwNx5XyoH1bw1lX1ph1r8AwD0mnzO0qaRR1K5IvA7kYHKAhoA0JvybzTfiPw28kQq1/ydpiwAAL3ujshmqWy9/Ezkj5HllAVmny0AMPuWipwS2SmVw2g+GnlOWQAA+ly+JvC4yOOR/VO5MhB4AyYAYPbkff7X1sV/7ji/3+IfAKDf5FsB3h6ZFrk88jElAQ0A6AkfilwdmS/yzsj3lAQAoN9dmcpDmktTuZXpp/XPa4AGAMyxoZH/jZwcuT6VPWeXKgsAQMN4LJUJzfyA5sDIVclVgfCanAEAr275yM9SGS3LV87kK/4mKgsAQMPap/75bUJkv8gflARmZQIAXmnrVJ7458X/4ZEjLP4BABpePqQ5XxX4VOSCyGeVBDQA4PXk/f5X1f823hY5UUkAAJrG7amcC3B+5NuR05NzAUADAF5mUOTYVPb75wP/Nq2vAAA0l2ci76sNgA9ELouspCzgDADIlkzl1NgdIyelcq/sJGUBAGh6+0dOizwb2TN5wEObMwFAu1s/8ue6+P9E5DCLfwCAlvGLyDaRyfXPfAcrCRoA0J7encp+/2Ui703l/lgAAFrLdZEtIjdETk3lykDQAIA2ksf88+mwj9XfEC5QEgCAlvWvyA6Rn0c+FTknsrCyoAEArS0f9vfjyHGRi1M56f9uZQEAaHnjIgdEvhDZPXJpZBVloZ04BJB2MiqVq2B2ihwf+VhkirIAALSdfCBgPh8gHw64TyrbQqHlmQCgXayZysEvefGfD/s7wuIfAKBtnR3Zqn778sjeSoIGALSGbVLp6uYRr3wnrMP+AAC4OZWzoO6InBn5jJKgAQDN7f2pPPmfENk68nslAQCgeijyjsi5ke9ETowMVhY0AKD5fD7yy1S6u1vXVwAA6O7FyF6R70cOTeV2KDcE0JIcAkgrGhj5YSr7/H8bOTAyWlkAAHgD+YrA70VuS+WgwAeVBA0AaFwLRE5L5WqXfNL/UZFpygIAwGzK0wB5ivSJyG7JFCkaANCQlkrlif8mqdzv+i0lAQBgLuTDAfNWgOGpHCL9JyWhFTgDgFaxVuTKyMaRAyz+AQCYB9elcobUPyMXRw5REjQAoDFsHrkiskzkPZGfKwkAAPPor5HtU9kC8JPIJ5UEDQDoXztHro7kvSy5S3uhkgAA0EMej2wb+V3kfyI/UBI0AKB/HFx/Mb4nslUqp7UCAEBPGh/ZO3JS5GORn0aGKQvNaJAS0KQ+Hflu5PrILpGnlAQAgF4yKXJY5PnI5yJLpnJN4BiloZmYAKAZ/b+6+M8n/u9k8Q8AQB/5fOToyI6RiyJLKwnNxDWANJtTIh+M/CKVLQBTlQQAgD52YCpbAe6P7BB5SEloBiYAaBb5DtYz6uL/+/UXXYt/AAD6w88i70vlFqpLI+soCc3ABADNYGTkrMg7I1+NHKMkAAA0gHwQdd4KMCWV26muURI0AGDuLZrKSf9bpnL36rFKAgBAA9k4cn5kgVTOp7pKSdAAgDm3bOS8yEaRD6Sy7x8AABrNapELIsulcjvABUpCI3IGAI1qlciVdfG/l8U/AAAN7O+R7SP/SmUaYH8lQQMAZs8akctS6aDmvVRnKwkAAA3ukcg7IrdFfp7K4dXQUGwBoNGsHflTZP7IeyJXKwkAAE1kkchvIttEPhw5WUloFCYAaCQbRC5P5cq/d1j8AwDQhJ5L5UHWxZGfRI5SEjQAYFZvi/w5MjCV6/5uURIAAJrU2MgekT9Gfhj5ipKgAQDFtpELI+Mt/gEAaBHjIruncijg1yPHKAkaALS7HVPpjI6ui//blAQAgBZqAuRrAfPV1l+OfFdJ0ACgXf1XKh3RfGJqvjblbiUBAKDFTIq8P3JG5NOaAPSnQUpAP8lP/i+IPJjKk/9HlAQAgBZuAuwfmVCbANlnlAUNANpl8Z+f/N9fv23xDwBAOzg00qkJgAYA7aJr7P8hi38AANpMZ20CdNQmQEe3ZgBoANBSup78P2DxDwBAGzu0vn6qNgVMAqABQEsu/vOe/x0ijyoJAABtKi/6P1y/bRIADQBaytvr4v9fFv8AAPCSQ+uaLE8CTIl8QUnQAKCZvS3yh8hTkfcmY/8AANAlTwIcFlkg8vnI5MjXlAUNAJrR+pHfR8amsgXgHiUBAIBZ5EX/vpEBka9GRkeOVRZ6Q0dnZ6cq0BvWjlxRfyHLi/9blAQAAF7TsMh5qdyadUTkeCWhpw1QAnrB6pE/WvwDAMBsmxjZI3Jx5P8iBysJPc0EAD1ttcglkUVSOfzP4h8AAGbfiFS20W4XOSjyMyVBA4BGtEzkqsib6uL/WiUBAIA5tlAqE7WbpjIVcK6S0BNsAaCnLBz5XWSlyO4W/wAAMNdejOwa+VvkzMg7lAQNABrFyFTGlN4a2at+GwAAmHtPRHaKPBi5ILK1kjCvbAFgXg2P/CGybWT/yBlKAgAAPWbFVLbZLhjZJnK7kjC3TAAwr5+fU+vi/xMW/wAA0OP+GXlPJD+5zZO2KykJGgD0h59E9ol8NfID5QAAgF5xR+TdkUVTuSZweSVBA4C+9J3IByPHRo5RDgAA6FX5kO1dIqtEzkvlpgDQAKDXfTrymcgv6rcBAIDed0kq525tmMrVgMOVhDnhEEDm1EGR01LpOuYT/6cqCQAA9KnDIifUJsCeqZwPAG/IBABz4r118X9jbQRY/AMAQN87MfL1yO6RHykHs2uQEjCbNomcE/lrKqeQjlYSAADoN1+LjIwcHXm6NgTgddkCwOxYO3JZKqNFW0fuVxIAAOj/9Vzk7FQmAQ5PZTIANACYa0ukcuLoMpEtIrcrCQAANIx8EOBFkW1SuSXgd0qCBgBzY8HIn1IZ/89j/xcqCQAANJzFI1dEVo5sH7lGSdAAYE4MjvwqlXGiAyOnKwkAADSsFSI3RAZGtoz8Q0l4ObcA8FqOq4v/z1v8AwBAw3s48r5UtgScH1lMSdAAYHZ8IfKRVA4R+bZyAABAU7gp8v7IaqkcDjhcSejOFgBebu/ImZHfR3aLTFMSAABoKh+OnBQ5I3JAZLqSkA1SArrJp/znff83Rw6y+AcAgKb0k8jykS9GHktlWy+YAOAlq6Zy3d/EyFaRR5QEAACaWp4A2DdyeCrbe9EA0AAgjYpcXpsA+cTQW5UEAACa3rDIpfXP+DtELlESDQBVaG9DIr+N7BTZJfI7JQEAgJaxZCqTvoukMul7j5K0L7cA8P26+P+4xT8AALScJyO7pvLg7zfJ9YAaALStvOj/aOT4yHHKAQAALemuyD6pXA+YzwVwGLwGAG1m58ixqewJOlo5AACgpV2QygPAd0Z+qBztyRkA7WmdyHWpjANtGnlOSQAAoC38b+TI2gwwBawBQItbpC7+l41sEvmbkgAAQNvI4/8XRbaPvDtyoZJoANC6/7Hn0Z8dUzn472IlAQCAtpOvAb8hlQMBN4vcqyTtwRkA7eV7dfH/cYt/AABoW89EdkvlAeE5kYWVRAOA1vKhyMciJyd7fQAAoN3lmwH2jawVOdXaUAOA1rFl5MTI9ZGjlAMAAAi/j3wxskvkG8rR+pwB0PryYX95f09u9uQT//+lJAAAQDe/iuxT82vl0ACgOQ2NXBLZOrJV5FolAQAAXma+ulZYPZVDAe9QktZkC0BrO7Yu/g+z+AcAAF7DuMiekYmRsyOLKokGAM3lg5GPRI6PnKQcAADA67g/lUMBV0kOBdQAoKnksZ186F9+6v8J5QAAAGbDRZEvRHaOfFk5Wo8zAFrP4pGbIyMiG0UeURIAAGAO5G0Ae6RyO8DvlEMDgMaUJzr+EPmvyPaRy5QEAACYQwtGboosncpDxX8oSessGGkdx9TF/6ct/gEAgLk0OrJXZHDkzFSmi9EAoIG8L/LFVMZ1/kc5AACAeXBX5EORDSLHKUdrsAWgNawYuTXyVGTTyPNKAgAA9IAfRo6KHBI5RTk0AOhfQ1I57X/9yMaRO5QEAADoIUNT2V68ac2tStK8bAFoft9P5WCOwy3+AQCAHjYp8oFUzgX4ZWSkkmgA0D/2jnw0lVGcU5UDAADoBQ9FDoqsFjlBOZqXLQDNK//Hl8dv7o9sERmvJAAAQC/678gXIkdGfqwcGgD0jeGRqyJrpzL+f4+SAAAAvWxQ5NLI1qmcB/AXJWkutgA0p+/Vhf+hFv8AAEAfmRo5IPJcch6ABgB9Ys/IEZGTI79QDgAAoA89GjkwskqyDaDp2ALQXFZOZd//w6ns+x+rJAAAQD/IU8mfinw4lYeTaADQg/J+mysjG6cy/n+nkgAAAP1kSF2fbBh5a+RuJWl8tgA0j6+l8tT/KIt/AACgn02OfCAyMfLzyAgl0QCgZ7wz8sXIWZETlQMAAGgAD0QOj6wf+Y5yND5bABrfYpE7Ujlxc4PIs0oCAAA0kFMjB0d2ifxOOTQAmHvnRHaPbBv5s3IAAAANZsHIzZFFUjkT4F9K0phsAWhsh9XF/zct/gEAgAY1OnJAKtPLectyh5I0JhMAjWutVK78uy3ytsgUJQEAABrYZyPfjnw8cpxyaAAwe4ZGromsHVkvcr+SAAAAjb6+jFwW2TqyaSoPNGkgtgA0pq9HNop81OIfAABoEvnp8gcj4yKnpPJgEw0AXkce98+jM2dHTlMOAACgiTwc+UgqVwN+Szkaiy0AjWXhyC2pdMry6Zn/URIAAKAJ/SKyX2S7yOXKoQHAK/0kckhkp8jFygEAADSpRSO3p3IuwFsizyhJ/7MFoHG8ry7+T7T4BwAAmtyzkYMjy0a+rxyNwQRAY1gicnf9j2TjyBglAQAAWsCPUjncfNfIb5VDA4CUzorsmcp1GdcoBwAA0CLmj9wUGZXKVoDHlaT/2ALQ//aqi//vWfwDAAAtZmwqWwEWjxyvHP3LBED/WjpyV+Tfkc1TuS8TAACg1RwT+XLkgMjPlUMDoB39LrJzKvv+/6IcAABAi8pXnd8cWT6ybuRfStL3bAHoPwfUxf83LP4BAIAWNynyocjIyI+Vo3+YAOgfy0T+Gnk4smn9jwEAAKDVdW0FODByunJoALSDsyN7JKP/AABAexkWuTGyQmTtyGNK0ndsAeh7e9XF/39b/AMAAG1mYuTDkYUiP1KOvmUCoG8tGbk78nRko+TUfwAAoD19M/LFyN6Rs5RDA6AVdY3+bxW5VjkAAIA2NTxya2TRyFqRZ5Sk99kC0HfeWxf//2PxDwAAtLkJkcMii0e+rxx9wwRA31g4cntkSmS9yHglAQAAmHEOwEcj745cqBwaAK3gxMihkR0jf1IOAACAGRaM3BXJC9N1ImOVpPfYAtD7tqyL/9Ms/gEAAGYxOnJ0KtcCflM5epcJgN6V77i8JZXT/9eMPKUkAAAAr3BGZN/Ixsl16b3GBEDv+mQqJ1oeafEPAADwmj4TeSGV7dODlUMDoNnkJ/5fS2Xs/0zlAAAAeE2PRz4V2SBylHL0DlsAeqmukUsiW6cyAfCAkgAAALyu/ID6z6lsA8gPVB9Skp4vMD3v/ZHtIl+1+AcAAJgt01O5EnBo5Fjl6HkmAHreqMjfIk9GNopMUhIAAIDZ9o3IlyK7Rc5TDg2ARnZC5LDI2yNXKgcAAMAcmT9yR2RgZL1UrgqkB9gC0LM2r4v/Uy3+AQAA5srYyNGRFSJfVI6eYwKg5+SrKm6IrBhZPbn2DwAAYF6ck8o2gPUjdynHvDMB0HMOjWwY+azFPwAAwDz7dGRi5LhUblpjHpkA6BlLR/4auT+VbQDTlAQAAGCe5Qes347sHzlDOTQAGsHPIgdENovcqBwAAAA9Yljk9sjIyJqR55Vk7tkCMO+2qIv/Uyz+AQAAelTeAvCxyJLJgYDzzATAvMnXUnQd/Je7Ufb+AwAA9LyuAwHXTWX7NXPBBMC8OTCyUeQrFv8AAAC95jOpTAMcqxRzzwTA3BsVuS/yWGTjyGQlAQAA6DVfinwjsnvkN8qhAdCX8lUUR0e2jfxZOQAAAHrVfKmM/0+NrB8ZpyRzxhaAubNuXfyfZfEPAADQJ/KC/1ORlet6jDlkAmDu/DGydSoH/z2sHAAAAH2zho1cmsoV7GtEHlWS2WcCYM69J7JD5LsW/wAAAH0qP8H+dGRE5JvKMWdMAMyZ4ZE7IkMja0fGKgkAAECfOyFyWGTzVK5mZzaYAJgzh0RWTeX0SYt/AACA/nFMZEzk29a1s88EwOxbLHJv5J+RTSPTlQQAAKDf5AMBvxfZI3KucmgA9KSua/+2jFynHAAAAP0qXwt4VyrnAqyXXAv4hoxKzJ7VI0dEzrb4BwAAaAh5wf/ZyEqRDyvHGzMBMHvOiexSGwEPKAcAAEBDyA+1r4qsE1kt8h8lef1i8fq2juweOdbiHwAAoKHks9k+H1ko8jnleH0mAF5fbpBcHVkrldP/n1YSAACAhnNWKg9u14z8XTlee4HLa8tj/1tEvmnxDwAA0LC+9rJXXoUJgNc2NHJbKqMkq0QmKAkAAEDD6rq5bfPIDcrxSiYAXtuHUhkf+ZzFPwAAQMP7TmR85BileHUmAF7dgpH7Ik9FNkjlYAkAAAAa25drA+BdkYuUY1YmAF7dUZGlIl+y+AcAAGgaeRvAk5H/tt7VAJgdS6Yy9n955ELlAAAAaBpjIt+KrJ/KrQB0YwvAK32rNgC2ilyrHAAAAE1leOTu+u11UzkXgGQC4OVWiHwslb0iFv8AAADNJx/inrdzrxT5gHLMZAJgVj+NHBhZJ/JX5QAAAGhKgyJ3RuaPrJFMAcxgAmCm1eri/+cW/wAAAE1tauQrkeVTueKdZAKgu9Mj+0fWTOUKQAAAAJp4vRu5MfLmVB74Pt/uBTEBUKxWF/9nWPwDAAC0hPy0+/ORxSJHK4cJgC6/TOWKiLUj9ysHAABAy/hz5C2RVSJPt3MhTACktEHk/ZGTLf4BAABazjGRhSIfbfdCmABI6TeRd6dyMuQ//bcBAADQcq6MrJ/afAqg3ScA8tP/XSP/Z/EPAADQsr6eyhTAEe1chHafAMhP/3eIrBx50n8TAAAALeuqyHqpjacA2nkCYMM08+m/xT8AAEBr+1pq87MA2nkCID/93ymyYuQJ/y0AAAC0vCtTuREgT4G33RRAu04ArJPK0//TLP4BAADaRj4LYMHIke34k2/XCYDTI/tEVk8O/wMAAGgnV6YyBZDPAniqnX7i7TgBsFpk/8ivLP4BAADaTtcUwKHt9hNvxwmA/PR/v8jakXt99gEAANpOvhEgT4SvGnmxXX7S7TYBsHpd/P/S4h8AAKBtfSeyeOT97fSTbrcJgBMjH46sGbnPZx4AAKAtDYzcFVkglQfF49vhJ91OEwBLRw5K5fo/i38AAID2NS1yTGS5VM6IawvtNAHwrcjnIptEbvZ5BwAAaGuDI3dEhkTWikxu9Z9wu0wALBn5aOQSi38AAADClMj3IitH3tUOP+F2aQB8IDJ/5Js+4wAAAFR5i/iTka+kci6ABkCTy4c6fDxya+Ran28AAACqMancCLB+ZDsNgOa3dypbAP5fpNPnGwAAgG5Or42AT7T6T7TVDwHsOtQhj3LkQx2m+WwDAADwMt+NfDqyWeTGVv1JtvoEwM6RNSPHWvwDAADwGn4YmZTK4fEtq9UnAK6LvDmySmSczzQAAACv4WeRfVOZHv9HK/4EW3kCYKvI5pGTLP4BAAB4A/lKwEGRQ1r1J9jKEwDnRnaKrBB5ymcZAACAN/CnVB4krxh5utV+cq06AbB6ZLfIGRb/AAAAzKZ8JeD8qWwFaDmtOgGQD/37eCp7N/7mMwwAAMBsyDfI3RpZOLJaZGIr/eRacQJg0VT2bFxs8Q8AAMAcyLfH5QfKy0fe02o/uVZsAHwglZGN7/vsAgAAMId+G3ki8gkNgMY2JJV7G++OXOlzCwAAwBwaEzk5smlkEw2AxrVjKqc1/iiV0Q0AAACYUz+JTI4c1Uo/qVY7BPCqyJq1CTDGZxYAAIC5dHoqtwGsFHmkFX5CrTQBsH5k61RGNSz+AQAAmBc/TuVWgA+2yk+olSYAToocHFkj8oDPKgAAAPPo2lQmAFaOjGv2n0yrTACMiuwXucDiHwAAgB6SpwCWTC1yJWCrNAD2j4yInODzCQAAQA/JD5nzlYD5MMAODYD+NzhyWORvkct9PgEAAOgheew/nzO3WeStGgD9b9vIqpHjI9N9PgEAAOhBp0WmRg5p9p9IKxwCeH7kbalc/feszyYAAAA97LeR7SNvjjzdrD+JZp8AeFNkx8iZFv8AAAD0knwY4HyRfZr5J9HsDYCDUjkD4FSfRwAAAHrJVZH7Ioc38zq6mRsAwyMfitwcucXnEQAAgF6SzwA4KbJ6ZEsNgL63U2SZVA7/6/R5BAAAoBedHZkU+XCz/gSa+RDAS1K5hiEfwvCizyIAAAC97FeRXSMrRJ5stn/5Zp0AWDmV6/9+ZfEPAABAH8nbAIZG9mrGf/lmbQDsFxkYOcXnDwAAgD5yXeTeyKF1TaoB0Mtyt+XgVA7+u9PnDwAAgD6SDwP8SWSNyOYaAL3v7ZHlUhm9cPgfAAAAfSkfBjg5cmCz/Ys34yGAv09l//+bIs/57AEAANDHflvXpStGnm2Wf+lmmwDI1/7tGPmNxT8AAAD9JE+kLxjZrZn+pZutAbBHZEjkVJ83AAAA+smVkX9HPqgB0Ds6anH/HrnB5w0AAIB+MjFyemTjyDoaAD0vF3btyE9TOXkRAAAA+ssZ9XU/DYCel4s6PXKOzxkAAAD97L7IdXWtOlwDoOcsENk3ckXknz5nAAAA9LN8pV6eUF86so0GQM/ZPrJw5BSfMQAAABrE7yITIgdoAPScAyMvRi71+QIAAKBBPBs5P/LeyGIaAPMuj1PkCYDzIs/5fAEAANBAfpbKGQDv0QCYd++LDIv80ucKAACABnN15PFUJtc1AOZRLuLDtagAAADQSMZHfh3ZMrKSBsDcWzOyUS3mFJ8rAAAAGtDZkY7I7hoAc2/X+vornycAAAAa1C2R+1K5vr5h19mN3AAYFNkvcncNAAAANKJpkTMi60TW0wCYcxtGVkue/gMAAND48s11nZG9NQDm3B61eOf4HAEAANDg7o3cHNkrMkQDYPYNTuXwhOsjD/ocAQAA0AR+EXlTKhPtGgCzaeNatF/6/AAAANAk/pDKJPueGgCzb59atIt9fgAAAGgSj0Suqw2AYRoAb2x4LdbVkYd9fgAAAGgi+SD7pSNbaAC8sc0jiyWn/wMAANB88jaAKakcbK8B8AZykaYm4/8AAAA0n3+lsg3gfZERGgCvbUQt0jW1aAAAANBszowsEdlMA+C1bV6LdKbPCwAAAE0qT7TnyfaG2gbQaA2AnSPTIpf4vAAAANCk8kT79ZH3RoZqALzSkMgutUiP+LwAAADQxM6KLBXZSAPgld4aWSbya58TAAAAmtxFkempPOjWAHiZXWpxnP4PAABAs3s4ckNk18hgDYCZBtWi3BJ5yOcEAACAFnBuZIVUJt41AKp1IytGfuvzAQAAQIvoOuB+Rw2AmXaqr3/w+QAAAKBF3Bf5ayoT7/2+/m6EBkBHKncj/q0GAAAAWkE+5+6cyFqRNTUAUlollS0A59fiAAAAQKvI2wDyg+/tNABmFsH4PwAAAK3m1sgjkd01AMpeiP+kcgMAAAAAtJIpkYsim0WWbecGwOKRLVN5+j/J5wIAAIAWdH5df2/dzg2ArSJDazEAAACgFd0QGRPZpZ0bAO+JjItc5/MAAABAi3oxckVk28gC7dgAGB7ZMXJN5FmfBwAAAFpYnnxfJLJROzYA1o8skYz/AwAA0Poui0yPvKsdGwA71tc/+xwAAADQ4h6N3Bb5r/5ai/dnAyDv//9H5H6fAwAAANrAhZE1Iiu3UwNghVS2AOTx/2k+AwAAALSBS+vr29upAbBlpCOVPRAAAADQDvIWgGdSP50D0F8NgLz/P1//9xfvPwAAAG1iQioPwreJLNQODYBhqdx9eHXkOe8/AAAAbeSSyAKpH64D7I8GwHqRpVI5/AAAAADayVWpXAf4jnZoAHQdduD6PwAAANrNQ5G/RnZK5Wy8lm4A5DsP/5lc/wcAAED76UzlNoC1I8u3cgNg8cgmqTz9n+J9BwAAoA1dWtfjW7RyA2CDyNDIn7zfAAAAtKlbIpMi27VyA2D7VMYdbvJ+AwAA0KaejdyQykGAg1qxAZAPN8jdjbsjj3q/AQAAaGN/TOUMgNVbsQGwbGSdVPY6AAAAQDu7qr5u3ooNgE1TmQK43PsMAABAm7sn8nxkh1ZsAOTx/4mRW73PAAAAtLkxqZwDkG8CGNFKDYCBkW0id0ae8j4DAABAuiSyRGS1VmoA5IMNVo5c5v0FAACAGa6rr1u0UgNgk/q/dY33FwAAAGb4WypXAm7bSg2AbSKTI7d5fwEAAGCG8amcA7BVZHgrNADyyf9vr4v/p72/AAAA8JK8VX5UZI1WaAC8ObJq5ErvKwAAAMyi6xyAzVqhAbBBfb3K+woAAACzuDfyYiqT803fAMh7GaZE7vK+AgAAwCzGRW6KbBoZ0swNgI7aAMgdjce9rwAAAPAKeWJ+mcjKzdwAWCKydrL/HwAAAF5L1zkAGzdzA2C9yOBuPxkAAABgVvekciXgls3cAOg6xfB27ycAAAC8qmcid9cGQK+t03u7AbBN5KHIw95PAAAAeE3XpHIGwDLN2ABYMPKWyM2p3AIAAAAAvLq8dX5gKufoNV0DYJXaBLjG+wgAAACv6476ulUzNgA2qq+3eh8BAADgdT2ayhb6TZuxAbBFZELkXu8jAAAAvK7pkZsiG0RGNFMDIO9byPcX5qf/L3ofAQAA4A3dEFkoskYzNQCWSOX0wpu9fwAAADBb/lJf122mBsC69Z99o/cPAAAAZst9kbGRLZupAfDW+nqH9w8AAABmy/ORf6Sypb6jWRoAm0SejPzb+wcAAACz7fpUttSPaoYGwNDIW1J5+j/eewcAAACzLZ8DMCyyejM0AJapud77BgAAAHPk9vr6lmZoAKxVX2/1vgEAAMAceSgyOpVzABq+AbBZfb3X+wYAAABzJN8CcGcqZ+s1fAMgXwH4WORf3jcAAACYY3kbwAqRJRu5ATA4smH9l53qPQMAAIA5dmNkUGSVRm4ALJdKh+I27xcAAADMla4t9es1cgOg65qCO7xfAAAAMFfyQYDjIhs1cgMgX1PQGfmb9wsAAADmyouR+yLr9+S6vacbAHn//zORR71fAAAAMNduiawaWbARGwADI2tF/hGZ6L0CAACAuZavAhwWWakRGwCLRVaM3Ox9AgAAgHlyd31duxEbAHnxn68puNP7BAAAAPPkgcjUyLqN2ADoup7AAYAAAAAwb/L5eg+nchBgwzUA1oxMSeW6AgAAAGDu5af/90TWiAxttAZAHkvIIwrPe58AAABgnuUt9ktGlmmkBkA+mTDfAJDH/6d5jwAAAGCe5QmAjsibGqkBsGxk4chd3h8AAADoEQ/W1x65CaCnGgAr1n/W3d4fAAAA6LEGwORGawCsVV//6f0BAACAHvFiKmftrdFIDYD8LzMh8oj3BwAAAHpEZyrnAORb94Y1SgNg9VTuJ3zB+wMAAAA95r7IopGlGqEBkLsQK6dyAwAAAADQc7rW2is1QgNgsVQ6Efd5XwAAAKBHda21V2yEBsDKL/uXAgAAAHrGk5FJaebh+/3aAFihvt7rfQEAAIAe9UxtAjREAyCfRjg18rj3BQAAAHpUXm//PfLmyKD+bgDkLsQTkWe9LwAAANDj8sT9MpFR/dkA6EjlJMJHI5O9JwAAANDj8gTA0MgS/dkAWDiVGwBcAQgAAAC946H6unJ/NgDyFYALJAcAAgAAQG95sL6u1J8NgOVf9i8DAAAA9Kz/RMZGVu3PBkDX/7gbAAAAAKB35MV/Pntvlf5sAOT9B531XwQAAADoedMjj9QGwMD+agDkewifjDzv/QAAAIBek7feL1bT5w2AfAXgipF/RqZ4LwAAAKDX/CMyKM3DVYDz0gAYHlkhzbyOAAAAAOgd/6yvS/dHAyB3HfIVgG4AAAAAgN717/q6Qn80AJaqrw97HwAAAKBXPZ3K9vuV+rMBYAsAAAAA9H4DIB/Av2J/NADeXF+f9D4AAABAr5oceSyyXH80AHLXYVzkWe8DAAAA9Lp8EGA+BHBYXzcAVog8F3nBewAAAAC97uHI4pEF+7oBsGzk8chU7wEAAAD0ukcjg1K5la/PGgDzp9J1cAAgAAAA9I2uqwCX6csGQB43WEwDAAAAAPrMv+rr0n3ZAFi0/r2PqT8AAAD0if/0RwOg63/scfUHAACAPjEmMjrypr5sAHTdO/iU+gMAAECfNQCe6rYm75MGwJL19Un1BwAAgD6Rb+F7OpVb+fqsAZBPHJwQeU79AQAAoM/krfijIkP7qgGwVCpjBxPUHgAAAPq0ATAyskhfNQCWrQ2ASWoPAAAAfSZfBZif/i/YFw2A/PfkCYCn1R0AAAD61L/r68J90QBYILJQ5Al1BwAAgD7VdRvf4n3RAMhdhuEaAAAAANDnug7jX6avGgD57/u3ugMAAECfeiHSmfpoAqDroIH/qDsAAAD0qWcik1M5m6/XGwBLdPsfBQAAAPrO+FSmAPpkAqCrAfCiugMAAECfmprKQYCL9VUDYHpktLoDAABAn3s6MioysLcbAHnMII8cmAAAAACA/msADOntBkAeM5iQTAAAAABAfzUA8g19Q3u7AbBIKgcATlNzAAAA6HPPpjL+v1BvNgA66v+AGwAAAACgf3StyRfuzQbAkPo/8Kx6AwAAQL94vr726gRA3l8wUgMAAAAA+s0zfdUAmF8DAAAAAPrNc33RAFiw/j0aAAAAANA/xvZVAyBzBSAAAAD0j3GRzsgoDQAAAABoXZNqRvZFA+A59QYAAIB+MSGVbQC9eg1gVwNgjHoDAABAvzUAxqc+mgCwBQAAAAD6x5TaAFikNxsA89fXseoNAAAA/SYfBLhAbzYA8nhBPmlwkloDAABAv3kxMizS0VsNgDwBMDGVcQMAAACgf7wQmS8ytLcaAHkCII8ZmAAAAACA/pO35g/vzQZA7i6YAAAAAID+NaYu/gf3VgMg3wKQTxo0AQAAAAD9p88mAKarNQAAAPSb0ZGBfdEAAAAAAPrPuPo6SAMAAAAAWr8B0CsTAPnHDknlDAAAAACg/3Q9nB/eGw2AvPjPpwuOVWcAAADoV5Pra69MAAyqsQUAAAAA+lfXdP78vdEAyE//8xTABHUGAACAfjWlvvbKBMDk2gQYrc4AAADQrybV12Gz+zfkkf51I19Kbzw2MKxm18iab/Bj8zaB4yJXe08AAACgx3VNAAyekwbAdzsnjt9h2mMPpjRwtq4PfHPNq5s2NQ1caoXUMd8Cq8X31u/2LwUAAAD0jK7p/IFz0gB4tHPK5PT0tw5Pkx+4MXUMG5nKzoDp9Ye81rfL9zs7p6eOjvrdKRPTwEWWS0uecFkaON8CT7zsBwMAAAA9Y536ulfkrDQb5/XlFf2xAxYYOW7kPh9PKS/mBwyNrw6MDK4p3+6o3+6Y8e2h9WsD40uDX/qxnZPHpYV2PiQNXGyZ/M/+dmSa9wQAAAB61IjI16ZPHJ/S9Ok7xrc/ODt/U24A3Bc5dfg2O6dhG+yUpk96MXV0DHgp+YfMeO2Y+Zo6Uv32wPr9+GtTJqXBy6yTRrx7v/zPvSJymfcEAAAAety+kVVe+L8vpEm3Xpm//9nIIrPTAMh+kAYNGr3Q7oenNH3KjEmA7jo7X/ntzhnfLt/JOwCmT34hLbjroWnAwovnp/7HeD8AAACgx+V9+5+d8vfb05jzf5zGXPCz/LVlI4fMbgPg4chPh262Qxq+3g5p+qQxLy30OzrSzD3+aea3u740oxEweUIavMJGacROuQmRLoxc5T0BAACAHndQZKUxZx8/4+H9uBv/kCb99ab89SMjC89OAyA7rmPgoNEL7nnojCmAjlf80Jlf6ezWDOiY0QB4IY3c47A0YIGR+cT/r3s/AAAAoMctFvnU5DuvS+Ou/k0aMN8SKU0ancace0L+a/kwvg/PbgPg4chPhm66Qxr+1nelzgnPlcV+58xlf2dd/Hd0bwZMGpeGrLJlGrb9nvm7v4nc5j0BAACAHndYZOkxZ5+Qpk8eN+Ncvo4Ri6bx156fJt15Xf7rR9UmwRs2ALLvdwwc9PTIfeLvGTjrFX8vbQl4qR1QvtY5ZXRaaNcPpQHD5stP/7/j/QAAAIAeNypyxOQ7rp0x9j9gxCIzVuYdHYNT59RxafSvfpi3BCwdXzx6dhsAT0Z+MGTDbdJ8W+6R0vjnZiz5Zzz170izbAuY8e3JY9KQVTZPw96xW/7eeZE7vCcAAADQ4z4SWWLMOSelNG18uZVvhs7UMXxUGn/TBWni9X/KX/hoZIXZaQBk8U9Ljy+w++Gpc+h8qeOl8wA66j+6bAaY8fR/6ti00J4fyU//J8SXv+n9AAAAgB6Xn+x/dPItf07jbvx9SsMXTbNs0+8oq/vR5x6fOqdNXSi+97HZbQD8f/buBN7zsewf+H1m38e+7ztZs+9bKZIQkiyFCu3antS/52lfpYVCm4pIWklUyBJStiKKJPvOGGZj5vyve+77mIPBnJnzO+e3vN+v18fPnFnP9f2e5b6+95If+39jxHqbp3Fb7pFmTn34ma5CTxug5+n/qHVfmUbvNPvp/6mRG1wTAAAA6Hfv6541c/HHzvhGSjOfigH/kDnD9Lpcf8jIhdK0a/+Qpl/5u/zDfFLASvPSAMhOjtwzYZ8jU9fwcbOPFuj1587eGyDNnJYmvvE98fMjH483fdb1AAAAgH63WuTI6Zeek6b+9TcpjV7k2Sfz9azVz02BIUPT42edlGcBTEhzmQXwQg2APAvg2OHrbZ7Gbr9PmvXkQ3Oe/Oc9AaY/lkZvuGsaueUu+Q3fS+UEAQAAAKB/HZ2efmrspJ+eGGP8IXV/vq7n/aK8TL9r5MQ07drfpmmXnZvfdGhtHrxkAyDLswBuzU/5h4xbInXPerq2AOJPnZXS+H2PSF1Dh02KN3zV9QAAAIB+lwfwB03907lp2g0Xpq5Rizxv0N+jq+c/Q4enSWd8LXXPmDY+fnTMvDYAnoh8dthq66Vxr9w/dU95sCwDmPZIGr3RLmnkFq/Mv+b7kf+6JgAAANDvjk5Pzxg3+az89H9476H/M6P+Z5bq10kBXSMXStNvvChN/f2Z+Ydvimw4Lw2A7PTIP8bv/bY0ZMJys9f9pyEj08Q3vjs//X8wfu5Y1wMAAAD63bqRQ6Ze+Is09e/56f/E5/2Cruf8/zN7A4wYlyb9/Dtp1tQnRsQPPzyvDYAY8acvDVtxzTT+FfummQ89nMZs+uo0YtMd88/l4wLvck0AAACg331w1rQpYyblp/9DR85+Q57y3/3cX9X9/IZA14jxacYtl6VpF/w8/zAf3bfhvDQAsjMiN43b8/A0ZPHF04Q3vDMfOXB3svYfAAAAGmGTyP5Tf3dGmn7zxSmNHD9nhN/97OF+V9fcfntX6hoxIU36xclp1rQpee3Ah+e1AZBnAXxm2Eprp6X+3w/S8PW2yG/7euRh1wQAAAD63Ue6n3x8xOSffXv2QP6ZcX/3Cw34n70hYP6FeRnAjFsuT1PPzyv7Z88C2Lyru7t7Xv7yoZELI9tFbo1sFnnUNQEAAIB+tWXk0smnfXXog196Xxo6Ib+pa77+oFnTu9PwpVdJy5x8SRqyxLLnDJvH3zcz8sHInyPHG/wDAABAQ7yhe+bMoWnGtLTw/u9IXcOHl8f/PT2A7nnoB/R6zj9r2pPpqbtuTSOXWHa3YX34RzziOgAAAEBD/aFr6NDDxr/lf8b18597cV8aAEOf8woAAAD0r3MiG0QWeYlft2LkrFT26PvRPPy5N/WlAfBUfR3regAAAEDD3FbzYh6vr/+I/HVe/tAhffgHzJqP3wMAAAD0v54lAvO8Q2BfBvN5BsCMyBh1BgAAgEE1sr5Oa0QDYGbNCHUGAACAQdWzpH9GIxoA+Q/NswBGqzMAAAAMqlH1taEzAIarMwAAAAyqEY1sAOQZANPTnI0GAAAAgMHR0D0A8uA/LwFwDCAAAAC0cQOguzYARqkzAAAADKqe/fmmNKoBMDU5BhAAAACapQHQkBkAWe4smAEAAAAAg6tnf76GHAOYPZFKl2GIWgMAAMCgyfvz9SzVb0gD4PHaAHAUIAAAAAye8alM/5/eqAbA5NoAGKHWAAAAMGjG1QZAw2YA9DQAzAAAAACAwTMxlY36G7YJYM8SgJFqDQAAAINmfG0ANGwJwKTIsGQJAAAAAAymCbUBMKtRDYAn6usYtQYAAIBBbQA82ZffMD9LALLxag0AAACDIo/l84P5RweiATBRvQEAAGBQjEplf75JjWwATK6vC6k3AAAADIo8+M/HAD7SyAaAJQAAAAAw+A2Ahi8BeKy+LqzeAAAAMCjyEoChaYD2ANAAAAAAgMExtr4+3MgGwPTItGQPAAAAABgsi9TXxxrdAMh/wRLqDQAAAIPaAHi80Q2AfMyAJQAAAAAwOBatrw2dATAzlWMGFldvAAAAGNQGQENnAGR5l8HFIl1qDgAAAAMuj8m7U4NnAGR5l8Fxac6ugwAAAMDANgAmR6Y0ugHwQGRMZKKaAwAAwIDLy/IfisxodAPg/shwDQAAAAAY1AbAU41uANxXXyeoOQAAAAyoIbUB8PD8/Ma+ur++LqTuAAAAMKBGp7IHwP0D0QDo2WVwaXUHAACAAbVQbQLcNxANgEkaAAAAADAoFq5j+QFpADwSmRZZSt0BAABgQC1WX+8diAZAXgLwZGRZdQcAAIABtUh9HZA9AJ6qf9GS6g4AAAADqmc2/iMD0QDI7oksERmm9gAAADBglos8neZs0N/wBsBdqcwAGKP2AAAAMGCWiTw+kA2AuyMTIuPUHgAAAAbMCpFHI5MHqgFwT321DwAAAAAMjCF1HH7f/P7m+XGvBgAAAAAMqLwMf/HI7QPZALizvi6j/gAAADAgxkcWjdwxkA2AByPdGgAAAAAwYBat4/i7BrIB8HjNSuoPAAAAA2K5+nrvQDYA8m6DD2gAAAAAwIBZvr4O6AyApyP3p3L8AAAAANB4gzIDIPt3KusPJrgGAAAA0HArRh6NTBroBsB/IgvXJgAAAADQWCtH7ok8ORgNgK5UziAEAAAAGqerNgDujswa6AZAz6YDK7oOAAAA0FCL1vxnfv+ABWkA9Gw6sLLrAAAAAA2VZ9+PSWU/vkFpAMyIrOo6AAAAQEMtWV9vG4wGwORU1h5YAgAAAACNtUp9vWswGgAzU1l7kJcADHUtAAAAoGFWT2Xzv3sHowGQagNgpcg41wIAAAAaJi+/nxS5f7AaAP+KjIgs61oAAABAQ/QcAZgfwk8frAbArfV1GdcDAAAAGmJ0bQDcsiB/yII2AHqOH1jJ9QAAAICGWCSy6GA3AB5I5SjAtV0PAAAAaIiV6uutg9kAeKg2AdZxPQAAAKAhVmmGBsBTkdtT6UY4ChAAAAD63xqR7shdg9kAyG6ILB9ZyDUBAACAfrdm5MHIw4PdAPhnZGxkKdcEAAAA+l2eAXBb5InBbgD8q76u7poAAABAv8qz7VdMC3gCQH81AHr+Eau5LgAAANCv8mz7iZG/N0MD4P7Ik8lJAAAAANDfVq6vNzVDAyCvQchHEaznugAAAEC/Wqu+/qcZGgCzUtkIMC8BGOXaAAAAQL95WWRKWsAjAPurAZDltQh5Y4LlXRsAAADoN3m5fT4B4PFmagBkK7o2AAAA0C/yLPu1U1n/390sDYDb6qt9AAAAAKB/5Fn2ebb93/vjD+uvBsCdqZwEsKHrAwAAAP2i5wSAvzVTA+CxyO1pzu6EAAAAwIJ5WX29pZkaANn1kdUj41wjAAAAWGAbRyalfjgBoL8bANdEFo4s5xoBAADAAsszAG5P/XACQH83AG6qr+u4RgAAALBA8uZ/q0Su7q8/sL8bAN0aAAAAALDA8gkAEyLXNWMD4L6aTVwnAAAAWCDr1dd/NGMDYGrkxvqPHOpaAQAAwHxbPzIrzVlu31QNgCyfTbhCZGnXCgAAAObbyyP/jTzYrA2AvDnBsMiqrhUAAADMl1GRDSM3RJ5q1gbAjfX15a4XAAAAzJc8s37xyF/68w/t7wbAbZEnU+lUAAAAAH23Wn29uj//0P5uAEyOXJ/KDIAu1wwAAAD6bONId+RfzdwAyPJGgGtGFnXNAAAAoM82izwUub3ZGwB5jcLwyFquGQAAAPRJHk/nIwDz9P+nm70B8Nf6up7rBgAAAH2ybCqbAF7Z339wIxoA+ZzCSZGtXDcAAADok/Xr6zWt0ADIg/9/RDZt0J8PAAAA7WqTVDYA/FsrNACyKyIrR5Zy7QAAAGCebRm5M3JvqzQA8j4AI5KNAAEAAGBejU5lCcB1kRmt0gC4tr5u4foBAADAPFklskTk0kb84Y1qANweeUADAAAAAOZZwzYAbGQDYFrkqlQ2AhzhGgIAAMBL2joyM3JjKzUAsrwRYN4EcBXXEAAAAF7SVqmcqvdAqzUArqqv67uGAAAA8KIWi6ybysP07lZrANyQyq6F27mOAAAA8KJeFhkeuaxRf0EjGwD3RW5K5QzDLtcSAAAAXtBm9fWaRv0FQxr8DuTORZ7CsJhrCQAAAC9ox8j9kdtatQFweSqnAGzoWgIAAMBcjYlsEvlzZGqrNgD+Ul+3dD0BAABgrlaNLB65pJF/SaMbAP+N3BHZ3vUEAACAudqivl7Zyg2AfApAPsIgT2WY4JoCAADA82wbeTyV0/RatgGQXVgH/2u7pgAAAPAsQ1OZNX9tZFKrNwB69gHYynUFAACAZ1klskLkj43+iwaiAXBT5KFUjjQAAAAA5ti0vl7aDg2AafUd2TqVow0AAACAYuc6br6+HRoA2UWRRZJ9AAAAAKDHsMh2kWtSmTnfFg2Ay+qrfQAAAACgWDGyWuSCgfjLBqoBcHPkgcguri8AAADMtkV9vbidGgBTI1dEtoyMc40BAABg9mb5UyLXtVMDIPt9ZNHIOq4xAAAAHS6v/98pcnXk4XZrAPTsA7C96wwAAECHWzWyUuR3A/UXDmQD4KbIvZFXus4AAAB0uG0iXWmA1v8PdANgRuTCyNaRia41AAAAHSw/HH8icn07NgCy8yNjIhu71gAAAHSoUalsAHhJ5PF2bQDkkwC66zsKAAAAnWjdyBKRPwzkXzrQDYDbIv+K7JrKWgcAAADoNNvW1wvbuQEwK5VlAOtHlnbNAQAA6ECvjdyVymb5bdsASLUBMDyVHQ8BAACgkywS2SxyUSqb5bd1A+AvkSmR3Vx3AAAAOsymkbGR3wz0XzwYDYAHaxPgFZERrj0AAAAdJO+J93Tk0k5oAGRnR5aNrOXaAwAA0CGGRl4TuS5yT6c0AHqOOnil6w8AAECHWDWyWuR3g/GXD1YD4B+p7Hi4u+sPAABAh9i5vp7bSQ2Ap+o7vEVkcfcAAAAAHWCPyEOpLAHomAZA9tvIqMhW7gEAAADa3EKRbVKZ/v9kpzUALk/lOMA93QcAAAC0uS0j41LZFH9QDGYD4IHIFZFXpzITAAAAANpVPv5vRuSSTmwAZL+MLBXZ0L0AAABAmxoWeV3kL2kQjv9rlgbABfX1Ne4HAAAA2tS6kRUivxrMf8RgNwBuTuVIwL0iXe4JAAAA2tBu9fW3ndwA6E5lA4SXRVZzTwAAANCG8vT/WyM3dXIDIPtlfX2VewIAAIA2s0pks1Sm/8/s9AbA9ZH7I3u7LwAAAGgzO9XXcwb7H9IMDYCpqcwCyGciLuXeAAAAoI3sE3kgcpUGQPGLyKjILu4NAAAA2kR+yL1D5DeRKRoAxZWRxyN7uj8AAABoE9tHRqY5e99pAIRJkfMjr4gs5B4BAACgDeS97iZHLtUAeLYzIuMj27lHAAAAaHETI7tFzos8qgHwbJeksibiDe4TAAAAWlye/j8u8tNm+Qc1UwPgocjvIq+JTHCvAAAA0MLyw+186t0fNQDm7uepTJPY1r0CAABAi8rL219VB/8PagDM3e8j0yL7ul8AAABoUXlvu0UjpzfTP6rZGgD3RS6KvDZZBgAAAEBr2i8yPZVl7hoALyKfBrBIZBv3DAAAAC0mT//fI3Jh5H4NgBeXOyQzIvu7bwAAAGgxefr/QqnJpv83awPgvtoEeF2yDAAAAIDWckAqe9v9rtn+YUOatGCn1sH/9u4dAAAAWkQ+1S4fbf/b1GTT/5u5AfCHyJPJMgAAAABaxw61CXBaM/7jmrUB8HDk3MjuqWwICAAAAM3uwMjkyAUaAH2TTwPIywB2cQ8BAADQ5JaI7JbKw+zHNAD65oJatIPdRwAAADS5XSNjUtnTrik1cwNgUuSsyCsiS7uXAAAAaGJvjDwUuVADYP78ODI8sod7CQAAgCa1QioPr/ND7CkaAPPnisidkUPcTwAAADSp10WGRk5v5n9kszcApqUyC2CLyJruKQAAAJpwXJ0fWt8WuVwDYMGcGemK7O++AgAAoMmsG9k4lc3/ntYAWDDXRq6PHJDKlAoAAABoFvvV1580+z+0FRoA3ZEfRNaIbO7eAgAAoEmMSOXo+qsiN2kA9I+fRWYmmwECAADQPLaLLB/5bioPrzUA+sEdkfMjb4hMcI8BAADQBN6cyub1Z7fCP3ZICxX2e5GJkd3cYwAAAAyyxSN7RX4TuVcDoH/9LvJI5FD3GQAAAINsj8iYyLdb5R/cSg2AyZEfRXaOrOZeAwAAYJDko+oPj9wVuVQDoDFOrf/m/d1vAAAADJL1I1tETolM0QBojKsj10QOiwx3zwEAADAIDqivp7fSP7rVGgD5WIWTIitFtnXPAQAAMMDGprL7f576/w8NgMb6ZWR6KrMAAAAAYCC9OrJE5Fut9g9vxQbAA5GfRfaOLOPeAwAAYAC9NfJo5FwNgIFxYmRUZD/3HgAAAAMkn0j3yshpkUkaAAPj8shNkbdHhrkHAQAAGAAH13H091vxH9+qDYCZqWwGuFZka/cgAAAADTY6cmjkL5FrNQAG1k8iMyJvcx8CAADQYK+KLBv5eion1LWcru7u7la+AHndRd4McJXIve5HAAAAGuT3kU0iK0cea8V3YEiLX4C8DCBvBvhG9yIAAAANkpefvyKVtf+Pteo70eoNgD9F/h45MjLCPQkAAEADHFxfv9fK70SrNwDyZoAnpHIUw47uSQAAAPrZ+MhbIxdHbtAAGFxnRSZH3uW+BAAAoJ/tEVkslc3/WlqrbwLY4/jIOyJrRv7l/gQAAKAf5IfmV0aWi6wamdrq70w7OKm+vtX9CQAAQD/Ju/5vmspD56mt/s60ywyA7ILIBqkcCfi4+xQAAIAFdErkgFSe/t/Z6u/MkDa6MN+ILBp5vXsUAACABbRsKkfOn9UOg/92awCcH7k98p42e78AAAAYeIekctz8Ce3yDrXTQHlqvTB5GcB27lUAAADm09jIkZGrIldoADSnU2oj4Gj3KwAAAPMpH/2Xd/4/LjKrXd6pdtoEsEeeBXBUZI3ILe5bAAAA+ig/+V8+slrkyXZ5p9pxrfyJ9fUd7lkAAAD6aKtUjv77RjsN/rN2nAGQnRvZMrJ65CH3LwAAAPPoF5Fd6njynnZ6x9p1t/yvRBaKHOzeBQAAYB7lpeS7R37cboP/rF1nAOTGxvWR8ZG1U9kYEAAAAF5M3vTvvZH1Ije040C5HeVdGr8QWTGV7g0AAAC8mCUjh0XOa8fBfzs3ALK8buP+yIfa/P0EAABgwR2YyizyL7TrO9jOA+O8W+OXI5tEtnEvAwAA8ALGRd6TylLyizUAWtMPI1NSmQUAAAAAc7N3ZPnIZyLd7fpOtusmgL3lWQDvj2wcucZ9DQAAQC/DIlenMv1/rciMdn1HO2Ft/PGpdHDe5b4GAADgOfLG8euncpz8jHZ+RzthBkCWz3DcL5UjAW9xfwMAAFBdElkjslrkiXZ+Rztld/zPRYYmswAAAACYI28Yv23k5HYf/GedMgMg+1Vk58gqkQfc5wAAAB3v/MhWqcwAuLfd39khHXRh82aAY5NZAAAAAKS0UWSXyAmdMPjPOmkGQHZRKqcB5LUdZgEAAAB0rlNT2Ssujw/v6IR3eEiHXeBPpHK0w6HudQAAgI6Vj/t7U+S0Thn8Z502AyC7MrJCZPXIk+57AACAjvODyIGRdSM3dco7PaQDL/RnI0tHDnbPAwAAdJy16+D/1E4a/GedOANgeOTayMTImpEp7n8AAICOcVLk8MjLIjd30jveiTMAnop8MrJc5BD3PgAAQMdYNfLmyBmdNvjPOnEGQDYscn0qGwLmzR/MAgAAAGh/x0feEdkkcnWnvfNDOvSiP53KiQDLJ7MAAAAAOkHeCy6fCPfzThz8Z506AyDLewFck8peAHkTCCcCAAAAtK8vRj4Y2biOBTvOkA6++HkvgE+lMgvAiQAAAADtK+8Bl6f+/7xTB/9ZJ88AyPJeANdFJiSzAAAAANrVCZGjUgc//c+GdPhNkPcCyCcCmAUAAADQnlZO5di/n3Xy4D/r9BkAWc8sgHwiwDrJLAAAAIB28q3I21N5+n9tJxdiiHvhmVkAK0QOUg4AAIC2kY99f1vkh50++M/MACjyLICrIkumMgtgkpIAAAC0vDzwPzCVPd/+2enFMAOgyLMAjoksEzlSOQAAAFreWnXw/yOD/8IMgGe7KPLyyOqRB5QDAACgZeWB/wGRl0VuVg4zAJ7rE6kcCfhOpQAAAGhZm6by9P9bBv9zmAHwfH+IbJbKdJF7lAMAAKDl/D6yZWS1yH3KUZgB8HwfSeVIwI8pBQAAQMvZJvKKyDcM/p/NDIC5Oz2yX2TNyK3KAQAA0BLyQ+5L61gur/2/X0meXRye79P19X+VAgAAoGW8LrJV5HMG/89nBsALy5tFHBHZPHKVcgAAADS14ZGrI4umMgPgCSV5NjMAXlieBTAtlZMBAAAAaG6HR9aLfNTgf+7MAHhxefD/8ciukfOUAwAAoCnl49z/EXk0smFkppI8nxkAL+7YyEORz0SGKgcAAEBTel9k2cgxBv8aAPPr8cj/RV4eOVA5AAAAms6SkQ9E/hg5WzlemCUALy1vJPG3yOhUjpF4UkkAAACaxsmRt0a2iPxZOV6YGQAv7anIhyMrRt6rHAAAAE1jvTr4P9Xg/6WZATDv/pjKUoB1IncpBwAAwKA7N7JzZO3Ibcrx4swAmHcfjIyP/D+lAAAAGHSvTuXEtq8Y/M8bMwD65pTIIanMBLhWOQAAAAbFiMhfIktE1kxlA3deghkAffPxyLTIF5QCAABg0OQHs+unMkPb4H8emQHQdx+LfCqyZ+RXygEAADCgFovcHLkzslkqG7ejAdAQeR+AfCzgjMiGkalKAgAAMGCOjRwd2TGVzdqZR5YA9N3kyEcia0TepRwAAAADJp/K9p7Izwz++84MgPmXb7aN6w14p3IAAAA03DmRV9RxmJ3/+8gMgPn3gci4VPYDAAAAoLF2j7wm8iWD//ljBsCC+VbkiMjWkcuVAwAAoCFGR65P5fi/DSKTlKTvzABYMP8beThyXGSocgAAADTEuyOrpzIT2+BfA2BQPBD5eCpHTxymHAAAAP1u5VQevl4UOUs55p8lAAtuWOSqyPKRdSP3KwkAAEC/+Ulk38hGqSwDYD6ZAbDgno68N7JY5JPKAQAA0G9eFdkv8jWD/wVnBkD/OSVySGTLyJXKAQAAsEBGRa6JLBRZO1n7v8DMAOg/H4k8mkpnyoaAAAAAC+Z9deBv4z8NgKZzb+SYVDYEfJtyAAAAzLdVUtlw/Q+RHytH/7AEoH/lJ/9/iqyTSqfqbiUBAADos7Mju0bWi9ykHP3DDID+NTOV8ynHRz6vHAAAAH22Z2T3yBcM/vuXGQCNcVwqJwPkjtV5ygEAADBPJkb+Hpka2TjyhJJoADS7hetN+0S9aZ9UEgAAgJf0lVQ2/3tN5Fzl6F+WADRGPg3g6MiakQ8pBwAAwEvapA7+Tzf4bwwzABrrV6l0rvIsgOuVAwAAYK7yhuqXR1aPrB+5S0n6nxkAjZW7V9Mix0e6lAMAAGCu8h5q+Uj1Dxv8N44ZAANzI+dNAd8ZOUE5AAAAnmXlyI2Rv0R2iBikagC0rGGRiyMbRNaJ3KEkAAAAz8jr/V9Vx0w3KEfjWALQeE9H3hEZG/macgAAADzjoFSOT/+EwX/jmQEwcD4TOSbypsiPlQMAAOhwS0f+Frk7lfX/M5REA6BdjEplTctSkZdFHlASAACgg+UHo2+MbJ3KCQA0mCUAAyefBnBUZLHIF5UDAADoYPvUwf9xBv8DxwyAgfeNVE4EeG3kHOUAAAA6zKKRv0cmR14eeVJJNADa1cTItZGRkfUijygJAADQQb4feXNku8ilyjFwLAEYeJMiR0SWiXxZOQAAgA7y2jr4/4bB/8AzA2DwfDNyZLIUAAAA6AyLpLLr/1ORDSKPK4kGQKfISwGuiYyIbBh5WEkAAIA21jP1f5fI75Vj4FkCMHjyUoA8A2C5yJeUAwAAaGN71MH/1w3+B48ZAIOvZylA/oA4WzkAAIA2s1TkulQegm4UmaIkGgCdakLkL/U1fzDcpyQAAEAbOS1yQGT7yCXKMXgsARh8eeOLQ1Ppih2vHAAAQBvZrw7+jzP4H3xmADSPz0Y+EjkocqpyAAAALW75VKb+3xPZPJn6rwHAM0ZH/hxZIZVTAW5XEgAAoIWdG9k1slkqy54ZZJYANI+pkUMiYyInR7qUBAAAaFFH1MH/xw3+m4cZAM3ng5EvRo5OZZ0MAABAK1kncm3kqsjOkRlKogHAC1yTyPmRnSIbR65XEgAAoEWMiPwxlRPO1o/coiTNwxKA5pM7Mm9PZUnAD1LZGwAAAKAV5Cn/W0beY/CvAcC8+U9tAmwQ+bRyAAAALSBP9/9o5Kep7GtGk7EEoLnlGQAHR3aP/EY5AACAJrVo5K+pLAHIU/8fVhINAPpmYuSaVE4GeHnkXiUBAACa0GmRAyKvTmVPM5qQJQDNbVIqRwMuFTlROQAAgCZ0aB38f8Hgv7mZAdAa/l/kk5H3Rr6mHAAAQJNYK5VZyzdGtk6O/NMAYIENS6WTtkNk81TW1gAAAAymUZGLI+tGNoncpCTNzRKA1vB05M2pLAn4UWSCkgAAAIPsM5HNIkcZ/GsA0L/ujByWyhQbywAAAIDBtGfk6MgPUzm9jBZgCUDrOS6VvQDe7AMNAAAYBCtEro88GNk4MllJNABojJGRy9KcdTY3KgkAADBA8v5kv49sE9kicrWStA5LAFrP9MhBkZmRUyNjlAQAABggn0hlc/L3GvxrADAwbo4cHtkwlSUBAAAAjbZ75JjIGZETlKP1WALQ2vIHXd5x85BUNt8AAABohBVTOY78sVR2/n9USTQAGFijIxdFNqgfhH9XEgAAoJ+NSGXd/1Y1f1GS1mQJQGubmsp+AE9HfhwZryQAAEA/+3Rku8g7Df41ABhct6RyJGA+FeCbygEAAPSj/SIfTGXJ8UnK0dosAWgfn498OPKuyPHKAQAALKC1I3+O/DeydeRxJdEAoDnk8zjPj+wY2T5yqZIAAADzaVwdU6we2SJyg5JoANBclolcE3kqsknkfiUBAADmwympnDb2xlSO/aMN2AOgvdwT2T+yXCprdIYqCQAA0EfvqYP/Yw3+NQBobn+MvDeyS+SzygEAAPTBDpGvRi6IfEQ52oslAO3rB5GDI29K5YhAAACAF5NnEl8VmRnZNHKfkmgA0BrGRv4UWSOyVeQ6JQEAAF7AiMgfItvUXK4k7ccSgPb1ZGSfyPTIWZFFlAQAAHgBX4tsGznS4F8DgNZ0aypLAFZNZUmATQEBAIDnOqLmhMhJyqEBQOs6N/LhyO6RzygHAADQy/aRb0UujhytHO3NHgCdo2dTwIMipyoHAAB0vBUjV0aejmwRuVtJNABoD2NS6eptENmufqADAACdaXQqR4hvHNk68mclaX+WAHSOKZHXRyalsingckoCAAAdK6/13yxyuMG/BgDt6Y7IvpGlI2em0vUDAAA6y8dSWRr82cgpytE5LAHoTIdGvls/2N+iHAAA0DHeEDkj8ovI3srRWYYpQUf6XmSNVE4H+Gfk80oCAABtb9NUNge/IZWHgnQYMwA6V17+8dNUun771f8HAADaU94D7IrIqMhWkVuURAOAzrJQ5MLIepFtks0/AACgHeUTwX6fyqZ/r0xl9386kE0AO9tjqawBeijys8jySgIAAG3n+6k89X+rwb8GAJ0tT/3JJwMsmcpGIOOVBAAA2kbe6X+/ZMd/NACoLkvlNICNU+kODlUSAABoeYdHPhI5NfJR5UADgB49nxReH/micgAAQEvbJfLtVKb8v105yGwCyHPlTxK5U3h05DjlAACAlrNBKrN874nsWF9BA4DnGRY5O/LqyP6RnygJAAC0jBVSOelrsVRO+rpBSdAA4MUsHLkosk4qHcM/KQkAADS9cZE/RDaP7FS/p4dn2AOAuXk0lb0A7o/8OrKWkgAAQNOP7c6og/9DDP7RAKAv/h3ZKzIq8svIMkoCAABN64TIayLHRH6oHGgA0Fd/jewTWTPyi8hYJQEAgKbzicgRka9EPqccaAAwv34bOSyyWeS0VDYJBAAAmsNRkY9Hzop8SDnQAGBBfS/ywcjrUplaBAAADL6e78/zxn8HRmYqCS/G01zm1Zcjy0beG3ko8lElAQCAQbNz5MzI9ZEDItOVhJfiGED6Km8oclDk3ZFvKAcAAAy4dSNXpHJ611aRu5SEeWEGAH11eGTxyNcjkyOnKAkAAAyYNSLnRJ5KZQmAwT/zzAwA5sf4yPmRLSN7RM5WEgAAaLilIhdHVo5sn8osAJhnNgFkfuQn/3tH/hX5aWQ7JQEAgIZaqH7vnWcAvMHgHw0ABtJ9kV0jd0d+E9lUSQAAoCHGRH4W2SbypsgvlAQNAAbabaksAXiqNgFWVxIAAOj3MVveiHunyLsiP1YSNAAYLDdGXptKVzJvRrKikgAAQL/oipwUeX3kfyPHKwkaAAy2P0V2T2UzkvMiyyoJAAAssDz4z6dwfbIGNABoCn9MZWPAtVI5FWCikgAAwHz7UuStkW+m8vQfNABoKnkJwMGRjSK/jIxVEgAA6LNjIh+I/CjybuVAA4BmlT9J5WlKO6RyTIkmAAAAzLv3Rz4TOT1yaGSmkqABQDP7buTIVI4JzE2AMUoCAADzNPj/cuTnkUMiTysJGgC0ghMj761NgHxUyQglAQCAF/SOOvjPy2oPTOWobdAAoGV8LfJ/kdfVJsBIJQEAgOc5IpUj/i6NHBCZqiQ0wjAloME+kUqj6eORaZGDIt3KAgAAs+Xvj78VuSKyR2SykqABQCvLx5aMjnwwMiXyNiUBAIC0X+SHkb+mMmv2MSVBA4B28KH6mpsAeQbAEclMAAAAOnvw/5M6+H9N5EElQQOAdmsCdKVypmleFvBWJQEAoIMH/9fUwf8DSoIGAO3og/U1NwFmRd6uJAAAdJB907Of/Bv8owFA2zcBuutrV20CWA4AAEC76z3tf7dk2j8aAHSI5y4HODI56xQAgPaVd/vPG/5dnaz5RwOADtR7JsBCkTdFpisLAABtJm+AnY/6M+0fDQA6Wp4JkPcC+HAqMwEOTOWoQAAAaAdHRU6IXB7Zy+CfwTRECWgC/xP5RP2EeFZkrJIAANAG3l8H/5dEdjf4Z7B1dXfbe42m8b7IVyK/jeyTzAQAAKC1B/9fjvwmlVmujykJg80MAJrJcalMkdo18qvIRCUBAKAFHVMH/3l26z4G/zQLMwBoRodFvhO5on7CvEdJAABoEZ9PZX+rfNxf3vnfSVdoAMBLODTy3cjNkVdH/qskAAA0uRMjb4/8KJWHWgb/NBVLAGhW34vsF1k1cn5kFSUBAKBJDY18uw7+vxF5s8E/GgDQNz+N7BZZPnJxZGMlAQCgyYyJnBE5PPLpyLtTOeYamo4lALSC7SPnRGZGXhu5VEkAAGgCedPqn0d2inw88ikloZmZAUAryE//d45MjpwX2UVJAAAYZEum8pAqD/7fafCPBgD0n6siO0TuTWVPgIOUBACAQbJGKg+ptom8KXKCkqABAP3r36nMBPhr5IeRtyoJAAADbIPI7yMrRvaK/FhJ0ACAxsjHAb4y8rvIyclUKwAABk6e7p+f/I+v35P+UknQAIDGeiyyd+TMyMcix7qXAQBosPz9Z16KOqk2Ai5TElrNMCWgRT0Z2T9yf+ToVKZgHRiZpjQAAPSzIyPfjFwfeV0qs1Kh5XhqSivLZ1jmc1b/N/L6VHZhXVJZAADoRx+vg/8LI68y+KeVdXV3d6sC7aCnK/u3VDZjuU1JAABYAHm29NciR0V+msopVNOVBQ0AaA57prIvwKOR16ZydCAAAPRV3uTvR6lM9z8u8oHILGWh1VkCQDvJu7C+sn5yvqg2BAAAoC9WSGWzvzz4PyaV/aYM/mkLZgDQjtaszYC1Im+LfFtJAACYBxtFfhZZOXJwKrMAoG2YAUA7+mdku1TOaD058mklAQDgJewSuSSySOQVBv9oAEDreDCye+SUyEfrJ/DRygIAwFwcnsq0/3tTeZB0gZKgAQCt5YnIWyKfjBwYOS+ytLIAANDLZ1NZMnppZKdUTpWCtmQPADpF3gvgxFSOB9w3cq2SAAB0tLGRkyJvivw4lVkAU5WFdmYGAJ0i7wWQlwQslsoJAa9VEgCAjrV85Pd18P+p+mrwjwYAtJFzI1tH7ov8OvI+JQEA6DibpjLdf8tUnvp/XEnQAID2dGNkm8jvIl+JnBAZriwAAB0hLwXNO/3n6f87R76rJGgAQHt7KJXlAHnN11GRsyOLKwsAQFv7f5EzIzel8vT/QiWh09gEkE53dOTYyM2R/SJ/VxIAgLbSe7O/n0UOi0xSFjqRGQB0urwMIG8ImI8HvCKyp5IAALSNlVNZ+pkH/19IZQmAwT8aANDBzolsG7kj8ovI/ygJAEDL2yFyeWTzyJvr93imP6MBAMye+r9dKtPCPhf5UWSCsgAAtKQjUjn6eXptBPxASUADAHrLmwPuE/l05MDIHyNrKwsAQMsYETk+8q3IxanM8rxMWaCwCSDM3f6R70emRQ5O5aQAAACa1wqRH0a2j3wz8r7IDGWBOcwAgLk7I5WO8X2RX0c+oiQAAE1rx8hVdfCfp/+/w+AfNACgL/5amwB5Y8DPpnJu7CLKAgDQVN4dubAO+LdJ5cg/QAMA+qxnX4BPpXJszCWRDZUFAGDQ5Q2b85LNr6Vy1N+WkT8pC7wwewDAvNs78r3IyMjbUjkpAACAgbdO5LRUHsx8KZXlmjOVBV6cGQAw736eSmf5hlQ2mPlqZJSyAAAMqLxZc17vv0bkjZEPGfyDBgA0wk2RnSLfjbwncn794gMAQGMNj3wxcnrkX5HNU9m4GZhHlgDA/MvLAPIZs49FDov8UkkAABpilVSWYuZd/vO6/7zx3xPKAn1jBgDMv5MjW0XuT+WkgM9ERigLAEC/2iOVKf/5dKYjI4ca/IMGAAyGP9cvRj+OHBP5bWRlZQEAWGBDU3nA8qvIw6nsxXSissD8swQA+s87U9kYMC8JyJ3pXysJAMB8WSnyncjOqez2n6f8P6IssGDMAID+c3wqswEeSqVTnTepGa4sAAB9smfkmjr4f1fkQIN/0ACAZnRFKvsCnBr5YOSCyJrKAgDwkvLxyl9OZW+lvMdSnvJ/vLJA/7EEABrnramcEjA1lRMDTlcSAIC5Wi9yUh30513+j05lWSXQj8wAgMb5dmSzVM6p/XH9ojZRWQAAniU/NMkbK2+Yyj5Khxr8gwYAtKK8fm27yAmpzAL4U2RrZQEASIulssFfPlr5usjmqTz9BzQAoGU9mcoJAXtHlohclsqRgQAAnWrHyF8jB0Q+V3/8d2UBDQBoF3lDm7wk4NxUzrQ9L7KasgAAHSSfkPTpyIWRoZHdUnkwMl1poPFsAgiD4z2R4yKPR45KZY8AAIB2tm4q0/3zRn8/ibw3cp+ywMAxAwAGx9ciW0TuTGXtW17vtqiyAABt6l2pTPnfIHJEZH+Df9AAgE5yVSod8GMjb05lw8DXKAsA0EZWiPwy8vXIlZGNUzkZCdAAgI7zROQDkd0jMyPn1IbAWKUBAFrcQZFrI69LZZ3/TpGblQU0AKDT/SayaSpLAY6OXBHZQVkAgBaUTz36UeSHkbsi26ay0/8spQENAKB4OHJoKsfhLBO5KPLZyGilAQBaRH7af3XkwMjnU1nueJmygAYAMHenp7JBTn79SP2iuYWyAABNbPHId1JZ75+P9HtF/T5mitKABgDw4u5OZSZAzqqpLAn4RDIbAABoPnumspnxYZETUlnWeIGygAYA0Dd5FsBGqXTTPx65PLKVsgAATSA/9f925BepPPXfNfLOyKNKAxoAwPz5T2SvyCGR5SJ/inwhMl5pAIBBkp/657X+h6fy1H+TyHnKAhoAQP/IO+luGPlJ5EOpnKW7g7IAAAMoP4w4NZWn/tMiu6Xy1P8xpQENAKB/5b0B9o+8MZVpd/mkgGMjiygNANBgeTbi3yJvqt9/vDzyW2UBDQCgsc5IZTbA9yNHR66N7KEsAEADrBU5O3JK5PbItpEPRJ5QGtAAAAbGPZFDI6+NzIr8KnJaZHmlAQD6wfDIe1N50PCayMdS2Yz4MqWB1tTV3d2tCtD68hKAYyLvT2Xn3Q+nsisvAMD82Czy1ciWkT9G3he5TlmgtZkBAO3hkVSm4uUpeTdHTo5cmMraPACAeZUfKnwp8ufIyyJHRnY0+AcNAKD55Cl526cyAyB37PPxPJ9KjgwEAF7a61OZ7p8fKuSd/teLnKgsoAEANK+nIl+MrB/5aSrr9WwSCAC8kDUiP4+cFZlav2c4KHKH0oAGANAabonsV5M/1vMmgfn0gNWVBgAIoyL/E7khslfkM5GNU9nxH2hDNgGEzjAx8tHIByNTIp+MfKP+PwDQeXZLZcZgXud/Xm0EXK8s0N7MAIDOMCnyoVQ2Bbwi8vlUNvd5jdIAQEdZLXJ65DeRhSMHRnY1+AcNAKD95L0AXhk5uH7RPyeVZQFrKg0AtLXRac50//0jx6ayX9BpSgOdwxIA6FxLpLIkIO/0OyOVdX9fS2W2AADQPvaMfC6yVuR3kWNSOSkI6DBmAEDneqA2ADaK/CHyichfIvsqDQC0hQ1S2dDvF6nMAHhj5FUG/6ABAHSu61LZC+AN9XPCmalsBrSp0gBAS8qz/L5Yv8bnAf+nazPgDKWBzmYJANDbmMj7Ih9L5WigEyJfiNypNADQ9EZE3pLKrL4lIz+NfDxys9IAGgDAC1mpfsOQv4l4IpUnB44NBIDm9epU1vlvGPlrKsf//k5ZgN4sAQDm5vbIoZFt6zcR+djAfILAAUoDAE0l7+Xz68hvI0tF3h7ZwuAf0AAA+uqyyI514N+VylFBl9TGAAAweFZMZXbeNZFdI5+KrBs5OTJTeYC5sQQAmFdjI0dFPhxZNHJW5P8iNyoNAAyY/DU4P+U/pn5tPiWVo3xvVRpAAwDob8vUJsA7U5lF9M1UlgjYKBAAGidvzptn5H0ysmzkglQ27b1SaQANAKDR1kllo8B8fGDeKDAfN/StyENKAwD9aq868M9T/K+vX39/rSxAX9kDAJhf/4jsH9ky8uf6jckNqUxLHKs8ALDAdolcGvl5ZELk8MhmBv+ABgAwWPLUw1dEdovcETkxlacTb/Y5BgDmy+Z1kH9+KjPu/ieVp//fjcxQHkADABhs+fihrSKHRJ6KfL82B/ZQGgCYJ+tHzqxfP1+VyuZ+a0e+EJmsPMCCsgcA0AjDI4dG/jeydP1GJn/z8kulAYDnWTWVDXbfmsoRfnlPna9G/q00gAYA0CoWqY2AD0SWjFycytOM3ysNAKQ1Iu+OHBEZGvlO5HOR25QG0AAAWrkRcFjkQ5HFUjm66LORC5UGgA6Un/i/N3JkHfifWQf+1ykNoAEAtIs8+H9n/aZnYuTsVI4PvExpAOgAq9evgfmJf96L66z6dfAvSgNoAADtaplUjgt8T20EnBf5SrI0AID2tFr9mtf7iX8e+F+tNIAGANAp8gaB+SlIfhqSzzf+Y+S4VGYG+OQEQDsM/PPXuKPy992Rn0a+HLlKaQANAKCTGwF5j4B3RZaIXJHKWsizlQaAFpSP83t7zdA68P9SMtUf0AAAeEbeLPDwVE4NWDyVJyR5acAvIjOUB4Amt1kqG96+vv74R5FvGPgDGgAAL2zhVI4PzOsll4/8M5Upk6dGpikPAE1mp1Sm+eeB/8zINyMn1K9fABoAAPNgfGTfVJ6mrBn5b+RbkVMi9ysPAIMoT+3fNfLhyDaRJyLfqQP/W5UH0AAAmD8jaiMgHyG4RWRS5PjI9yK3KQ8AA2hM/Zr0wcjLIo9Ejo18N2lOAxoAAP3q1ZH3R16RyjTL/LTl28lRSgA01pKRt0TeEVkuckvk65GfRB5UHkADAKBxNo0cHdm//vicVJYHnKs0APSjvAQt7+b/tsjYVE6qyRv7/TwyXXkADQCAgbNqKk9j8ukBec+APBMgLw/IRy49qTwAzKcd68D/DfXHv06l0Xye0gAaAACDa4lUTg7IT2hWjtwTOTGVkwP+ozwAzINxkb1T2dF/81ROnsn7zeTlZtcqD6ABANBcRkVel8qGgXlX5lmpnMN8UirTNgHgufKRswfWgX9e339n5OTI9yN3Kw+gAQDQ/LasjYA35s93kctSOZ7pN5HJygPQ8bZKZQnZAZGRkatSWd//K18nAA0AgNa0eipPdvLygKVSWR6QZwTk5QGOEQToLBMje6TytD8fLZtPlDmjfl24VHkADQCA9pA3CXxtKrMCtqxvy8c35bObL4o8rUQAbWvdyCGRN0cWi/w3lWNk8zKxO5QH0AAAaF/5GME87fNNqRzrdHMqmzydmcraTwBaX/78/qrIYZHd6tv+kMr6/rwcbIoSARoAAJ1jychekSMj66cyCyAfIZh3fc6zAmYqEUDLWSuVdf1vSWVTv0mpPOnPn9vt5g9oAAB0uCGR7VPZJ2CfyLDIPyI/qA0BRwkCNLf8tP+Vqczuek19Wz79JT/t/3XkESUCNAA0AACea4XaBHhzZL36tp/VZsAFyZRRgGaSZ28dlMqSrqUjj6WyyWv+nP1X5QHQAACYF3lWwDaRg1OZSjo6lf0B8jeWecfovykRwKDIy7d2jxyaylF+WV629f1U1vZ72g+gAQAw3/JTpTyl9C29vtm8LJU1pfm86PuVCKChRqayVCsf67pvZFQqu/fnhmxuzP5diQA0AAD62wapzAh4Y2T5yNTaBMjNgIsjTyoRQL/ZqA748xT/vEQrb9b6y1Sm+Ocd/acpEYAGAECj5SUBO6ay9vR19cd3R05PZePAq5QIYL6snsqsq9xs3bS+7crIDyNnR+5SIgANAIDBktej5jOm89TUnerb8h4BP0lldsCNSgTwkp9HXx3Zv75mt6Yyxf/MZIo/gAYAQBNaI/L6yBtSWS6Q5aOo8syAcyP/ViKA2RaKbFcH/Xkm1ZjIfZGf14F//tz5tDIBaAAANP3n2MjGqRwpuF9k5fr2S2oz4LzI7coEdOCgf/v6eTFP858YeTyVBulpqezmby8VAA0AgJY1IpV1rHlmQN7MarlI/gR8QSpTW89PZTdrgHY0oQ76c0N0j9oEmJHKkX35Sf+FkYeUCUADAKDd5M0Ct+r1jfAy9e35BIGzIr9NlgkArW/hVKb35891u0YWrYP+36eyUWrewf9uZQLQAADoFGMjW0f2rs2ApevbL438IpWZAf9QJqBF5M9hO6Synj9vjDo+laNSe2Y75UH/vcoEoAEA0OnyzIBNaiNgz8hq9e1/69UM+GvkKaUCmsjqddCfP2/tHBkZeSKVNf0/S2V20/3KBKABAMDcDa/NgPwELT9JW6++/T+prJk9J3JV5FGlAgbYsMj6qWzgl6f2b1nffl8d9P86lVlMjygVgAYAAH33slTOxd49lSdt2aRUptXmb7Yvqc0BgEbIm/ZtUz8P5cZkz6kmt0R+mcoMpSuT3fsBNAAA6Fcr1m/E88yAHSOL1bdfncrRgnmGwN9TmYILML/WTmXn/t3qa97JP3/j+KfI2als5nd9ZJZSAWgAANB4+RvyfLzgrjXr1Lfnqbd5s618okBef2t2APBSFo9sFnlFZJden08eqJ9PcnMxzza6S6kANAAAGHx5qcAOqTyxy0cNLlTffkNtBuSztvNGgs7bBkalsr9IPqrvVfVzxtj6c39OZUbR7yLXRaYoF4AGAADNq2d2wCtTWbe7QX379FSm8F5QGwI3RiYrF7S9IZE1Utm0Lz/hz0uIlqw/l5/q/6EO+K+I3K5cABoAALSulVJ5wpen9+6Uyl4C2cP1G/78zf/lkZuS/QOgHQyrH/db1MF+Ts/mfbnpl5cHXZRKIzB/3E9XMgANAADaTz5mMK/v3TyVGQJbR5auP/dQbQhcUF//oSEALaHnCf/LIzvXj+s1689NS2X5T37Cn4/ouybyuJIBaAAA0HnG1oFDPl1gh8i2qWwIlj2WyvFe+WlhniFwcyqbggGDa1xklVSm9G9dP25Xqj83tQ7y89P9vHHf33zcAqABAMDcjE5lhsCWtSGQdwZfvv5c3gzshtoQyHsJ5CMH74g8rWzQUIumsmlf/njMG/flJ/09M3eejFyVytP9Sw34AdAAAGB+5d3CV6kDj/ykMc8UWKvXz9+eyq7hl9dByK3JSQPQHx9zG6WyVCdnw8iI+vP3RK5OpRGXP+ZyI+4xZQNAAwCARsibia1dmwF5cJJPHBhffy7vGfDPVJYO/CVybW0SWHPcOHn991tTmanxw8i/lKRljEzlSf4GdcCfP6bWSXOe7ufZNTekOU/489T+21JZ1w8AGgAADLg8+M+zAtatA5jcEMgbkPU8sZyUynni19fGQG4Q/CfyqNL1i91Td/fZqaurp9anRL5eB4o0j/zxkJtnPTNqNq4D/xV6/Zrb6oD/kvrxYjo/ABoAADS9pSKr1WbAhrUxsFyvpkDPTIH8ZDNvLnh1bQrcF5mlfH1yVPesmSc8duzRadRG26ZRO+6ZuoYOy82VkyLHR+5WogGX1+wvUwf4L+s12F+i16/JA/s8Q+bKev/ngf9dkaeUDwANAADaoSmweiqbmW1eX/N055H15/MXpjx9/d+pLB/Ia5tvq42BSfXneb635cH+vYdtk6bf+Kc0ZrNd04R9j0wjt9k9dXV15fXiJ0a+nUpzhf6V1+vnJ/i52ZVnvWxUB/z5ZI1xvX5dvo/zsZq54XVNvc/zBprTlRAADQAAOsUiqUyLzk9H8zKCLSKrpvL0tEceJOXNBW9MZbbADbVJcG+NBkBKJ91/1C5p+j//lNLMWal7yNA0ZpNXl0bApvlY+NmzAL5ZGwEPKlmfLZzK0/t8r65fB/i5eZX3wlio1697rN6bPUte/lHzcGSGMgKgAQAAz5aXCSxbB1t5X4GemQJ50LXYcxoDecr0bbU5cGsdfOXk6dV5mcHMTmoAzPjXVal7xNj4Ij8rzZr6SOoaNjqN3eK1adw+b0sjN8xHxac7I8fVRsATbrVnGZNKQ2qlVJpQea1+fpq/Vr0few/08yZ8eQnLTXWAnwf7/6n1tSM/ABoAALCA8nTrpWtjYLXaGFir/njFyLBev3ZqKqcP/KemZ2nBPbU5kJ+Ct8sT2V4zAK5MXSPHp9lf4vOegN2zUvczjYDd0/h93p5GlEZAbpjkjQJPS+Uc+Y743ieVtfn5Sf6SdaCfm0p5WcoK9R5a4jm/J98vd9WB/nX1nsr30X+Tky0A0AAAgAE3rA7cclatA7r89HbN+uM8a2Bkr1+fN1nLm+TdXQdzt9dBXn56e0dtEExO5Ql5K2zINqcB8K8rU9eI8aln/N+jOzcCpjyYhoxYKI3ZYe80Yb93pOGr51UXs5dTfLU2Alr9aLm85n5CKk/x84aTy9fXFep9sGJtAIztXZpU9pfIs0hyk+iWek/ckuY0i6b4EANAAwAAmt+Q2gDIMwfyvgIrpTJ7YOU6OFw2PXu/gR55UPhgzd29GgR5I72HUlnT/XBtJEwZ5EbBs2YApJHjnxn8v2AjYPxSafyO+6axe701DV8lr66Y/XT7S5EzUzl7vlkMTaV5s3Ad2C/c63r2DPDz9Vs8zWkCPdcjdTCfr2N+cn9rHfDnt91br+k0HyoAaAAAQHvL677H1QHk8rUh0DO4XLn+OA88J0ZGz+X3T6vNgp5lBQ/UxsBDvRoFj9TXPKNgav09Pa/9sQzhLZHvPdMAGDE+dXXN/ReWhkBX6p75dOqe+kAaMmGZNH6HfdK4vd+WhpVGwGWRYyO/Sv176sKQWr+cUfV1XK3r4r0G9oumOdP0F69ZrP6eoc/5M2fW2j9aB/O5QXN7r8H+PTV5qv7k5BQJADQAAICXkJ9AL1QHqQvVwWk+0jA/eV6yZvFeA9j864a9yJ+XB/953f2U+przWG0QPFZ//Hh9nfycpkFuGEyvP366/p59Ix/tvQfA3Af+9f/jB11dXfG2+J9ZT6fuKQ+kIQutlMbvckAat9dhadiyefVEuiTyf7WJMbzWYFgdiA/rNZAf2WswP6G+ju/144Xr/+dfM7Y2XMbMZTDf2+TaSOlpoOTGSn5Kf38d2N9X6/RYHfxPdosCgAYAAAykIXVAnDOxZqE6EO5pICyS5kxlX6j+/9iakb1eR7/EIPl5nr0EoCv1PPB+7jKAOU2B2XMByv/Peip1T34wdY1bPC18yDFp/AHveYHf9ZKmPqdh8WR9fbTm8fr6YK8fT6rpGdBP69XgAAD6wTAlAIB+NavXALivR8Hl0XY+/jA/Ve954j6i/v+I2hgYXd/eM4V+eP3/HSIHzP7bnxm2z2nyd8X/dnfVqf/d3XOWB8yeChD/6JlPxTD9oTRk0RXS+O32SqNevl3Pn/LDyJX1D8vv01N1YJ5fey9n6Hlbz+yEGb3+f6bbAgA0AACAObrrgHn6fPze6bMbAEPm1lPofmbwP/uZf1fvn3sqzXrywTRkwvJp3K7vT+P3OjwNWzEfnJCuiXwucpbLAgAaAABA8xj1rE5C95AY6M+avca/Kz33FID8n6dTmvpwSqMXSRN2fUcat98RafgqL8s/nU8COC5yRuqfzQkBAA0AAKBR8uA/1YF/2fCvZ/BfjgDsGrVQGrPTQWnC3kekEettnn/q+shX68DfcXgAoAEAALSSZ/b6zZv9T30wDRk+Pgb+B6eJe789DS8D/9sjX4p8P5X1/ACABgAA0Oyev2f/rNQ99bHUPWRoGrPFnmnCG96ZRm60bf6J/0ZOiHwnlV33AQANAACgVTzzwH/2doL5VL2ZadTLd5n9xH/UNv+fnTtGaSAKwgA8zxRLGknAOwTsLAPBNmBaa0vB2gt4ADsFq4S09h7HgL12MaQQdzOrrndY+D74L/B3M8N7F93g/5RZZj40BgAWAABAT9X7bZTvrxiezeP48jqq6TzK0aC98j9mHjLvWgIACwAAoJ9Ke/Zvdp9RnZ7H+Oo2qtmiG/xXf8P/m5oAwAIAAOj5AqCp6xjd3P288S/VsB381/H7zn+jHgCgNP/fAwMAPTbJvGROMs+Z+8yrWgCAzkGAAQBFK8fC4BJHagAAAABJRU5ErkJggg==";
10203
+ const CONTROL_SIZE_MULTIPLIER = 1.15;
10204
+ const CONTROL_SURFACE_GAP_MULTIPLIER = 0.001;
10205
+ function isRugRotationControlPrimaryHit(control, intersectedObjects) {
10206
+ return intersectedObjects[0] === control;
10207
+ }
10208
+ function createRugRotationControlLayout(resourceBounds) {
10209
+ const size = resourceBounds.getSize(new Vector3());
10210
+ const side = Math.max(size.x, size.y) * CONTROL_SIZE_MULTIPLIER;
10211
+ return {
10212
+ positionZ: resourceBounds.min.z - side * CONTROL_SURFACE_GAP_MULTIPLIER,
10213
+ side
10214
+ };
10215
+ }
10216
+ function normalizeDegrees(degrees) {
10217
+ return ((degrees + 180) % 360 + 360) % 360 - 180;
10218
+ }
10219
+ function getPointAngle(point, center, inverseSurfaceQuaternion) {
10220
+ const localPoint = point.clone().sub(center).applyQuaternion(inverseSurfaceQuaternion);
10221
+ return Math.atan2(localPoint.y, localPoint.x);
10222
+ }
10223
+ function resolveRugRotationDegrees({ center, currentPoint, initialPoint, initialRotation, surfaceQuaternion }) {
10224
+ const inverseSurfaceQuaternion = surfaceQuaternion.clone().invert();
10225
+ const initialAngle = getPointAngle(initialPoint, center, inverseSurfaceQuaternion);
10226
+ const currentAngle = getPointAngle(currentPoint, center, inverseSurfaceQuaternion);
10227
+ const deltaDegrees = MathUtils.radToDeg(currentAngle - initialAngle);
10228
+ return normalizeDegrees(initialRotation + deltaDegrees);
10229
+ }
10230
+ const CAPTURE_EXCLUSION_USER_DATA = {
10231
+ excludeFromCapture: true
10232
+ };
10233
+ function RugRotationControl({ resourceBounds }) {
10234
+ const { resourceRef, rotation, setIsDragging, setRotation } = useRoomViewerSceneState();
10235
+ const texture = useTexture(arrows_ruginline_namespaceObject);
10236
+ const gestureRef = useRef(null);
10237
+ const layout = external_react_useMemo(()=>createRugRotationControlLayout(resourceBounds), [
10238
+ resourceBounds
10239
+ ]);
10240
+ useLayoutEffect(()=>{
10241
+ texture.colorSpace = SRGBColorSpace;
10242
+ texture.needsUpdate = true;
10243
+ }, [
10244
+ texture
10245
+ ]);
10246
+ const handlePointerDown = (event)=>{
10247
+ const resource = resourceRef.current;
10248
+ if (!resource || !isRugRotationControlPrimaryHit(event.object, event.intersections.map((intersection)=>intersection.object))) return;
10249
+ event.stopPropagation();
10250
+ const pointerTarget = event.target;
10251
+ pointerTarget.setPointerCapture(event.pointerId);
10252
+ resource.updateWorldMatrix(true, false);
10253
+ const surfaceQuaternion = resource.getWorldQuaternion(new Quaternion());
10254
+ const center = resource.getWorldPosition(new Vector3());
10255
+ const normal = new Vector3(0, 0, 1).applyQuaternion(surfaceQuaternion);
10256
+ gestureRef.current = {
10257
+ center,
10258
+ initialPoint: event.point.clone(),
10259
+ initialRotation: rotation,
10260
+ plane: new Plane().setFromNormalAndCoplanarPoint(normal, center),
10261
+ pointerId: event.pointerId,
10262
+ pointerTarget,
10263
+ surfaceQuaternion
10264
+ };
10265
+ setIsDragging(true);
10266
+ };
10267
+ const handlePointerMove = (event)=>{
10268
+ const gesture = gestureRef.current;
10269
+ if (!gesture) return;
10270
+ event.stopPropagation();
10271
+ const currentPoint = event.ray.intersectPlane(gesture.plane, new Vector3());
10272
+ if (!currentPoint) return;
10273
+ setRotation(resolveRugRotationDegrees({
10274
+ ...gesture,
10275
+ currentPoint
10276
+ }));
10277
+ };
10278
+ const endGesture = (event)=>{
10279
+ if (!gestureRef.current) return;
10280
+ event.stopPropagation();
10281
+ const { pointerId, pointerTarget } = gestureRef.current;
10282
+ if (pointerTarget.hasPointerCapture(pointerId)) pointerTarget.releasePointerCapture(pointerId);
10283
+ gestureRef.current = null;
10284
+ setIsDragging(false);
10285
+ };
10286
+ if (layout.side <= 0) return null;
10287
+ return /*#__PURE__*/ jsxs("mesh", {
10288
+ "position-z": layout.positionZ,
10289
+ userData: CAPTURE_EXCLUSION_USER_DATA,
10290
+ onPointerCancel: endGesture,
10291
+ onPointerDown: handlePointerDown,
10292
+ onPointerMove: handlePointerMove,
10293
+ onPointerUp: endGesture,
10294
+ children: [
10295
+ /*#__PURE__*/ jsx_runtime_jsx("planeGeometry", {
10296
+ args: [
10297
+ layout.side,
10298
+ layout.side
10299
+ ]
10300
+ }),
10301
+ /*#__PURE__*/ jsx_runtime_jsx("meshBasicMaterial", {
10302
+ map: texture,
10303
+ transparent: true,
10304
+ depthWrite: false,
10305
+ side: DoubleSide,
10306
+ toneMapped: false
10307
+ })
10308
+ ]
10309
+ });
10310
+ }
10094
10311
  const FLOOR_RESOURCE_ROTATION_X = Math.PI / 2;
10095
10312
  function FloorResource({ glbUrl, position, quaternion, materialPatch }) {
10313
+ const { type } = useRoomViewerMetadata();
10096
10314
  const { resourceRef, rotation, setIsDragging } = useRoomViewerSceneState();
10097
10315
  const gltf = useGLTF(glbUrl);
10098
- const { sceneInstance, materials } = external_react_useMemo(()=>{
10316
+ const { sceneInstance, materials, resourceBounds } = external_react_useMemo(()=>{
10099
10317
  const sceneInstance = gltf.scene.clone(true);
10100
10318
  const materials = collectClonedMaterials(sceneInstance);
10319
+ const resourceBounds = new Box3().setFromObject(sceneInstance).applyMatrix4(new Matrix4().makeRotationX(FLOOR_RESOURCE_ROTATION_X));
10101
10320
  return {
10102
10321
  sceneInstance,
10103
- materials
10322
+ materials,
10323
+ resourceBounds
10104
10324
  };
10105
10325
  }, [
10106
10326
  gltf
@@ -10124,14 +10344,19 @@ function FloorResource({ glbUrl, position, quaternion, materialPatch }) {
10124
10344
  onPointerDown: ()=>setIsDragging(true),
10125
10345
  onPointerUp: ()=>setIsDragging(false),
10126
10346
  onPointerLeave: ()=>setIsDragging(false),
10127
- children: /*#__PURE__*/ jsx_runtime_jsx("group", {
10347
+ children: /*#__PURE__*/ jsxs("group", {
10128
10348
  "rotation-z": rotationRadians,
10129
- children: /*#__PURE__*/ jsx_runtime_jsx("group", {
10130
- "rotation-x": FLOOR_RESOURCE_ROTATION_X,
10131
- children: /*#__PURE__*/ jsx_runtime_jsx("primitive", {
10132
- object: sceneInstance
10349
+ children: [
10350
+ 'rugs' === type ? /*#__PURE__*/ jsx_runtime_jsx(RugRotationControl, {
10351
+ resourceBounds: resourceBounds
10352
+ }) : null,
10353
+ /*#__PURE__*/ jsx_runtime_jsx("group", {
10354
+ "rotation-x": FLOOR_RESOURCE_ROTATION_X,
10355
+ children: /*#__PURE__*/ jsx_runtime_jsx("primitive", {
10356
+ object: sceneInstance
10357
+ })
10133
10358
  })
10134
- })
10359
+ ]
10135
10360
  })
10136
10361
  });
10137
10362
  }
@@ -10602,6 +10827,8 @@ function Room() {
10602
10827
  'floor' === placement ? scenePlacement.resourcePose && glbUrl && /*#__PURE__*/ jsx_runtime_jsx(DragControls, {
10603
10828
  autoTransform: false,
10604
10829
  onDrag: scenePlacement.handleDrag,
10830
+ onDragEnd: scenePlacement.handleDragEnd,
10831
+ onDragStart: scenePlacement.handleDragStart,
10605
10832
  children: /*#__PURE__*/ jsx_runtime_jsx(FloorResource, {
10606
10833
  glbUrl: glbUrl,
10607
10834
  position: scenePlacement.resourcePose.position,
@@ -10611,6 +10838,8 @@ function Room() {
10611
10838
  }) : scenePlacement.resourcePose && src && /*#__PURE__*/ jsx_runtime_jsx(DragControls, {
10612
10839
  autoTransform: false,
10613
10840
  onDrag: scenePlacement.handleDrag,
10841
+ onDragEnd: scenePlacement.handleDragEnd,
10842
+ onDragStart: scenePlacement.handleDragStart,
10614
10843
  children: /*#__PURE__*/ jsx_runtime_jsx(WallResource, {
10615
10844
  src: src,
10616
10845
  position: scenePlacement.resourcePose.position,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@neurodyn/react-room-viewer",
3
3
  "type": "module",
4
- "version": "0.0.6",
4
+ "version": "0.0.8",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },