l-0DJL4V [/]/b/-r1du1|v1dwrBzsBtBPuBvBBBBBEB5#B%B&BT(B!0B8B:BCB3BBYBB$B rBsB wOzOOOߋOOQO}OOƞOԟOءO$OֻOtOOOOOOOOOOOb OY O$OROO!`h`Y8cf9c:cq;ccr?cg@c AcBcCcDc7Ec"Fc%Gcd)Hc"*IcFJcBIKcRLcTMcYXNcdOcgPcpQcRchScTcUcVcWcXcOYc( Zc.B [c.B \cY ]c] ^c.| _c `c ac. fl gl6/ hlUE il jlK kl{ llglmlmnlmolinplnqlorlnpsl]qtl#rulrvlswltxlWuylvzlv{lw|l8x}lx~lylzlp{l{l|l}l~ll>l^l)l׃l<lllqlllll!lPlgllllclbllœl(lll˗ll|ll"lllllloll߬l^l˭lZlll2ll#llvllCl[llll6llllldl8l llQllllll`lc.m /mK0m\1m^2m73mb4mb5m6m7m8m+9m:mM;mmG ?m @mAmBm\CmQDmEm/Fm<;Gm;Hm;ImB<Jm<Km<Lmc=Mm=Nm%>Om>Pm>QmV?Rm?Sm0@Tm@UmAVmvAWmAXm?BYmBZmB[m7C\mC]mC^m+D_mD`mDam?EbmEcmEdmZFemFfmGgm~GhmGimMjm_QkmSlmOfmmjnmqom{pmqmWrmsmtmumpvmwmuxm4ymzm3{m8|m!}m5 ~mmX@mfCmYMmdXm_mkmwm؀mmWmDmsmmmmm7mmm mmjm mm>m_CmEmeKmyUm8Vmumf{m"mBmmmmmJmimGmmm]mmm mmmmmmJmmm m m mF mymmgnQ n nc nn#n#nf&n *nC+n8/n6n8n}9n3<n?n@nfEnEn>InL n`M!nY"n]#nT^$n`%nGg&nMm'nxq(nv)nF{*n~+n,n-nB.nƈ/nA0n1n2n3n4n 5na6n7n}8n9n::n;nn~?n@nAnoBnCnADnEn0FnGGnHnIn$JnKnLnDMnnNnOnyPnQn RnGSnTnaUn&Vnl)Wn*XnX.Yn3ZnJ[n]\nkr]n^nu_n`n&an@4bnhAcn2MdnNenQYfn^_gnhnintjn6knͯlnVmnnnʵonXpnqnrnwsntnUun4vnwnxn6ynCzn{n|ns }n~nnnn3!n"n*nU,n93n4n8n=nBn$DnPnQnUnzVnYnZn `nannbnTdn1engnhnknlnnnonrn?sn[unvnxnyn{n}n2nYnznnnnnn=nnΏnnnnnnĝnnܣnYn nnnnnnҲnnnJnncnnnnnOnEnnnnnnnn nnHnann7nnnHn}'nv)n .nj.n2n3nf5n5n9n:n1=n CnCn"HnYKnSn VnZn2anegnqn}n4nnnPnڎnnngn7nWnnMnsnngnAnoo3o_osotoSoo8o. ovnvZv~vvp v vo vl{ "services": [ { "display_name": "Content Service", "name": "content", "interface_provider_specs": { "service_manager:connector": { "provides": { "navigation": [ "content.mojom.NavigableContentsFactory" ] } } } }, { "display_name": "File Service", "name": "file", "interface_provider_specs": { "service_manager:connector": { "requires": { "*": [ "app" ] }, "provides": { "file:leveldb": [ "leveldb.mojom.LevelDBService" ], "file:filesystem": [ "file.mojom.FileSystem" ] } } } } ], "display_name": "Content (browser process)", "name": "content_browser", "interface_provider_specs": { "navigation:shared_worker": { "provides": { "renderer": [ "blink.mojom.BudgetService", "blink.mojom.CacheStorage", "blink.mojom.LockManager", "blink.mojom.NotificationService", "blink.mojom.PermissionService", "blink.mojom.QuotaDispatcherHost", "network.mojom.WebSocket", "payments.mojom.PaymentManager", "shape_detection.mojom.BarcodeDetectionProvider", "shape_detection.mojom.FaceDetectionProvider", "shape_detection.mojom.TextDetection" ] } }, "navigation:dedicated_worker": { "provides": { "renderer": [ "blink.mojom.BudgetService", "blink.mojom.CacheStorage", "blink.mojom.DedicatedWorkerFactory", "blink.mojom.LockManager", "blink.mojom.NotificationService", "blink.mojom.PermissionService", "blink.mojom.QuotaDispatcherHost", "device.mojom.UsbDeviceManager", "network.mojom.WebSocket", "payments.mojom.PaymentManager", "shape_detection.mojom.BarcodeDetectionProvider", "shape_detection.mojom.FaceDetectionProvider", "shape_detection.mojom.TextDetection" ] } }, "service_manager:connector": { "requires": { "data_decoder": [ "image_decoder", "json_parser", "xml_parser" ], "cdm": [ "media:cdm" ], "shape_detection": [ "barcode_detection", "face_detection", "text_detection" ], "file": [ "file:filesystem", "file:leveldb" ], "network": [ "network_service", "test", "url_loader" ], "content_renderer": [ "browser" ], "media": [ "media:media" ], "*": [ "app" ], "content": [ "navigation" ], "resource_coordinator": [ "coordination_unit", "coordination_unit_introspector", "service_callbacks", "page_signal" ], "service_manager": [ "service_manager:client_process", "service_manager:instance_name", "service_manager:service_manager", "service_manager:user_id" ], "chromecast": [ "multizone" ], "content_plugin": [ "browser" ], "metrics": [ "url_keyed_metrics" ], "content_utility": [ "browser" ], "device": [ "device:battery_monitor", "device:generic_sensor", "device:geolocation", "device:hid", "device:input_service", "device:mtp", "device:nfc", "device:serial", "device:vibration", "device:wake_lock" ], "video_capture": [ "capture", "tests" ], "unzip_service": [ "unzip_file" ], "tracing": [ "tracing" ], "patch_service": [ "patch_file" ], "ui": [ "arc_manager", "display_output_protection", "video_detector" ], "audio": [ "info", "debug_recording", "device_notifier", "log_factory_manager", "stream_factory", "testing_api" ], "content_gpu": [ "browser" ] }, "provides": { "field_trials": [ "content.mojom.FieldTrialRecorder" ], "font_loader": [ "content.mojom.FontLoaderMac" ], "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ], "gpu_client": [ "ui.mojom.Gpu" ], "plugin": [ "discardable_memory.mojom.DiscardableSharedMemoryManager", "ui.mojom.Gpu" ], "app": [ "content.mojom.MemoryCoordinatorHandle", "discardable_memory.mojom.DiscardableSharedMemoryManager", "memory_instrumentation.mojom.Coordinator" ], "dwrite_font_proxy": [ "content.mojom.DWriteFontProxy" ], "renderer": [ "blink.mojom.BackgroundSyncService", "blink.mojom.BlobRegistry", "blink.mojom.BroadcastChannelProvider", "blink.mojom.ClipboardHost", "blink.mojom.EmbeddedFrameSinkProvider", "blink.mojom.FileUtilitiesHost", "blink.mojom.LockManager", "blink.mojom.Hyphenation", "blink.mojom.MimeRegistry", "blink.mojom.PluginRegistry", "blink.mojom.ReportingServiceProxy", "blink.mojom.StoragePartitionService", "blink.mojom.WebDatabaseHost", "content.mojom.AppCacheBackend", "content.mojom.ClipboardHost", "content.mojom.FieldTrialRecorder", "content.mojom.FrameSinkProvider", "content.mojom.MediaStreamTrackMetricsHost", "content.mojom.PeerConnectionTrackerHost", "content.mojom.PushMessaging", "content.mojom.RendererHost", "content.mojom.ReportingServiceProxy", "content.mojom.ServiceWorkerDispatcherHost", "content.mojom.WorkerURLLoaderFactoryProvider", "device.mojom.BatteryMonitor", "device.mojom.GamepadHapticsManager", "discardable_memory.mojom.DiscardableSharedMemoryManager", "media.mojom.KeySystemSupport", "media.mojom.VideoCaptureHost", "media.mojom.VideoDecodePerfHistory", "memory_coordinator.mojom.MemoryCoordinatorHandle", "metrics.mojom.SingleSampleMetricsProvider", "network.mojom.URLLoaderFactory", "resource_coordinator.mojom.ProcessCoordinationUnit", "ui.mojom.Gpu", "viz.mojom.CompositingModeReporter" ], "font_cache": [ "content.mojom.FontCacheWin" ], "gpu": [ "discardable_memory.mojom.DiscardableSharedMemoryManager", "media.mojom.AndroidOverlayProvider" ] } }, "navigation:service_worker": { "provides": { "renderer": [ "blink.mojom.BackgroundFetchService", "blink.mojom.BudgetService", "blink.mojom.CacheStorage", "blink.mojom.CookieStore", "blink.mojom.LockManager", "blink.mojom.NotificationService", "blink.mojom.PermissionService", "blink.mojom.QuotaDispatcherHost", "network.mojom.RestrictedCookieManager", "network.mojom.WebSocket", "payments.mojom.PaymentManager", "shape_detection.mojom.BarcodeDetectionProvider", "shape_detection.mojom.FaceDetectionProvider", "shape_detection.mojom.TextDetection" ] } }, "navigation:frame": { "requires": { "content_renderer": [ "browser" ] }, "provides": { "renderer": [ "autofill.mojom.AutofillDriver", "autofill.mojom.PasswordManagerDriver", "blink.mojom.AnchorElementMetricsHost", "blink.mojom.Authenticator", "blink.mojom.BackgroundFetchService", "blink.mojom.BudgetService", "blink.mojom.CacheStorage", "blink.mojom.ColorChooserFactory", "blink.mojom.CredentialManager", "blink.mojom.DisplayCutoutHost", "blink.mojom.DedicatedWorkerFactory", "blink.mojom.LockManager", "blink.mojom.GeolocationService", "blink.mojom.InsecureInputService", "blink.mojom.KeyboardLockService", "blink.mojom.MediaDevicesDispatcherHost", "blink.mojom.MediaSessionService", "blink.mojom.NotificationService", "blink.mojom.PermissionService", "blink.mojom.PrefetchURLLoaderService", "blink.mojom.PresentationService", "blink.mojom.QuotaDispatcherHost", "blink.mojom.SpeechRecognizer", "blink.mojom.TextSuggestionHost", "blink.mojom.UnhandledTapNotifier", "blink.mojom.WebBluetoothService", "blink.test.mojom.VirtualAuthenticatorManager", "content.mojom.BrowserTarget", "content.mojom.InputInjector", "content.mojom.MediaStreamDispatcherHost", "content.mojom.RendererAudioInputStreamFactory", "content.mojom.RendererAudioOutputStreamFactory", "content.mojom.SharedWorkerConnector", "device.mojom.GamepadMonitor", "device.mojom.Geolocation", "device.mojom.NFC", "device.mojom.SensorProvider", "device.mojom.UsbChooserService", "device.mojom.UsbDeviceManager", "device.mojom.VibrationManager", "device.mojom.UsbDeviceManager", "device.mojom.VRService", "device.mojom.VRService", "device.mojom.WakeLock", "discardable_memory.mojom.DiscardableSharedMemoryManager", "media.mojom.ImageCapture", "media.mojom.InterfaceFactory", "media.mojom.MediaMetricsProvider", "media.mojom.RemoterFactory", "media.mojom.Renderer", "mojom.ProcessInternalsHandler", "network.mojom.RestrictedCookieManager", "network.mojom.WebSocket", "payments.mojom.PaymentManager", "payments.mojom.PaymentRequest", "resource_coordinator.mojom.FrameCoordinationUnit", "shape_detection.mojom.BarcodeDetectionProvider", "shape_detection.mojom.FaceDetectionProvider", "shape_detection.mojom.TextDetection", "ui.mojom.Gpu" ] } } } }{ "display_name": "Content (GPU process)", "name": "content_gpu", "interface_provider_specs": { "service_manager:connector": { "requires": { "device": [ "device:power_monitor" ], "content_browser": [ "dwrite_font_proxy", "field_trials", "gpu" ], "ui": [ "discardable_memory" ], "*": [ "app" ], "metrics": [ "url_keyed_metrics" ] }, "provides": { "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ], "browser": [ "content.mojom.Child", "content.mojom.ChildControl", "content.mojom.ChildHistogramFetcher", "content.mojom.ChildHistogramFetcherFactory", "content.mojom.ResourceUsageReporter", "IPC.mojom.ChannelBootstrap", "service_manager.mojom.ServiceFactory", "ui.ozone.mojom.DeviceCursor", "ui.ozone.mojom.DrmDevice", "viz.mojom.CompositingModeReporter", "viz.mojom.VizMain" ] } } } }{ "services": [ { "display_name": "Heap Profiling Service", "sandbox_type": "profiling", "name": "heap_profiling", "interface_provider_specs": { "service_manager:connector": { "requires": { "*": [ "app" ], "resource_coordinator": [ "heap_profiler_helper" ], "service_manager": [ "service_manager:all_users" ] }, "provides": { "profiling": [ "heap_profiling.mojom.ProfilingService" ], "heap_profiler": [ "memory_instrumentation.mojom.HeapProfiler" ] } } } }, { "display_name": "Content Decryption Module Service", "sandbox_type": "cdm", "name": "cdm", "interface_provider_specs": { "service_manager:connector": { "requires": { "*": [ "app" ] }, "provides": { "media:cdm": [ "media.mojom.CdmService" ] } } } }, { "display_name": "Media Service", "name": "media", "interface_provider_specs": { "service_manager:connector": { "requires": { "chromecast": [ "multizone" ], "*": [ "app" ] }, "provides": { "media:media": [ "media.mojom.MediaService" ] } } } }, { "display_name": "Audio", "sandbox_type": "audio", "name": "audio", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "info": [ "audio.mojom.SystemInfo" ], "testing_api": [ "audio.mojom.TestingApi" ], "stream_factory": [ "audio.mojom.StreamFactory" ], "log_factory_manager": [ "audio.mojom.LogFactoryManager" ], "debug_recording": [ "audio.mojom.DebugRecording" ], "device_notifier": [ "audio.mojom.DeviceNotifier" ] } } } }, { "display_name": "Data Decoder Service", "name": "data_decoder", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "json_parser": [ "data_decoder.mojom.JsonParser" ], "xml_parser": [ "data_decoder.mojom.XmlParser" ], "image_decoder": [ "data_decoder.mojom.ImageDecoder" ] } } } }, { "display_name": "Device Service", "name": "device", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "device:mtp": [ "device.mojom.MtpManager" ], "device:input_service": [ "device.mojom.InputDeviceManager" ], "device:screen_orientation": [ "device.mojom.ScreenOrientationListener" ], "device:ip_geolocator": [ "device.mojom.PublicIpAddressGeolocationProvider" ], "device:power_monitor": [ "device.mojom.PowerMonitor" ], "device:nfc": [ "device.mojom.NFCProvider" ], "device:wake_lock": [ "device.mojom.WakeLockProvider" ], "device:serial": [ "device.mojom.SerialDeviceEnumerator", "device.mojom.SerialIoHandler" ], "device:geolocation_config": [ "device.mojom.GeolocationConfig" ], "device:fingerprint": [ "device.mojom.Fingerprint" ], "device:geolocation_control": [ "device.mojom.GeolocationControl" ], "device:time_zone_monitor": [ "device.mojom.TimeZoneMonitor" ], "device:geolocation": [ "device.mojom.GeolocationContext" ], "device:battery_monitor": [ "device.mojom.BatteryMonitor" ], "device:hid": [ "device.mojom.HidManager" ], "device:vibration": [ "device.mojom.VibrationManager" ], "device:generic_sensor": [ "device.mojom.SensorProvider" ] } } } }, { "display_name": "Metrics Service", "name": "metrics", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "url_keyed_metrics": [ "ukm.mojom.UkmRecorderInterface" ] } } } }, { "display_name": "Network Service", "sandbox_type": "network", "name": "network", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "test": [ "network.mojom.NetworkServiceTest" ], "network_service": [ "network.mojom.NetworkService" ], "url_loader": [ "network.mojom.URLLoaderFactory" ] } } } }, { "display_name": "Global Resource Coordinator", "name": "resource_coordinator", "interface_provider_specs": { "service_manager:connector": { "requires": { "metrics": [ "url_keyed_metrics" ], "service_manager": [ "service_manager:all_users", "service_manager:service_manager" ] }, "provides": { "tests": [ "*" ], "page_signal": [ "resource_coordinator.mojom.PageSignalGenerator" ], "coordination_unit_introspector": [ "resource_coordinator.mojom.CoordinationUnitIntrospector" ], "app": [ "memory_instrumentation.mojom.Coordinator" ], "heap_profiler_helper": [ "memory_instrumentation.mojom.HeapProfilerHelper" ], "coordination_unit": [ "resource_coordinator.mojom.CoordinationUnitProvider" ] } } } }, { "display_name": "Shape Detection Service", "name": "shape_detection", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "face_detection": [ "shape_detection.mojom.FaceDetectionProvider" ], "barcode_detection": [ "shape_detection.mojom.BarcodeDetectionProvider" ], "text_detection": [ "shape_detection.mojom.TextDetection" ] } } } }, { "display_name": "Tracing", "name": "tracing", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:singleton", "service_manager:service_manager" ] }, "provides": { "tracing": [ "tracing.mojom.Coordinator" ], "app": [ "tracing.mojom.AgentRegistry", "tracing.mojom.PerfettoService" ], "tests": [ "*" ] } } } }, { "display_name": "Video Capture", "sandbox_type": "none", "name": "video_capture", "interface_provider_specs": { "service_manager:connector": { "requires": { "service_manager": [ "service_manager:all_users" ] }, "provides": { "capture": [ "video_capture.mojom.DeviceFactoryProvider" ], "tests": [ "video_capture.mojom.DeviceFactoryProvider", "video_capture.mojom.TestingControls" ] } } } }, { "sandbox_type": "none", "display_name": "Visuals Service", "name": "viz", "interface_provider_specs": { "service_manager:connector": { "requires": { "catalog": [ "directory" ], "*": [ "app" ], "ui": [ "ozone" ], "service_manager": [ "service_manager:all_users" ] }, "provides": { "viz_host": [ "viz.mojom.VizMain" ] } } } } ], "display_name": "Content Packaged Services", "name": "content_packaged_services", "interface_provider_specs": { "service_manager:connector": { "requires": { "content_browser": [], "*": [ "app" ], "service_manager": [ "service_manager:client_process", "service_manager:singleton", "service_manager:user_id" ] }, "provides": { "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ] } } } }{ "display_name": "Content (plugin process)", "name": "content_plugin", "interface_provider_specs": { "service_manager:connector": { "requires": { "device": [ "device:power_monitor" ], "content_browser": [ "dwrite_font_proxy", "field_trials", "font_cache", "plugin" ], "ui": [ "discardable_memory" ], "*": [ "app" ], "font_service": [ "font_service" ] }, "provides": { "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ], "browser": [ "content.mojom.Child", "content.mojom.ChildControl", "content.mojom.ChildHistogramFetcher", "content.mojom.ChildHistogramFetcherFactory", "content.mojom.ResourceUsageReporter", "IPC.mojom.ChannelBootstrap" ] } } } }{ "required_files": { "v8_natives_data": [ { "path": "natives_blob.bin", "platform": "linux" }, { "path": "assets/natives_blob.bin", "platform": "android" } ], "v8_snapshot_64_data": [ { "path": "assets/snapshot_blob_64.bin", "platform": "android" } ], "v8_snapshot_data": [ { "path": "snapshot_blob.bin", "platform": "linux" } ], "v8_snapshot_32_data": [ { "path": "assets/snapshot_blob_32.bin", "platform": "android" } ] }, "display_name": "Content (renderer process)", "name": "content_renderer", "interface_provider_specs": { "navigation:shared_worker": { "requires": { "content_browser": [ "renderer" ] } }, "navigation:dedicated_worker": { "requires": { "content_browser": [ "renderer" ] } }, "service_manager:connector": { "requires": { "font_service": [ "font_service" ], "*": [ "app" ], "metrics": [ "url_keyed_metrics" ], "ui": [ "discardable_memory", "gpu_client" ], "device": [ "device:power_monitor", "device:screen_orientation", "device:time_zone_monitor" ], "content_browser": [ "dwrite_font_proxy", "field_trials", "font_loader", "renderer" ] }, "provides": { "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ], "browser": [ "blink.mojom.LeakDetector", "blink.mojom.OomIntervention", "blink.mojom.WebDatabase", "content.mojom.AppCacheFrontend", "content.mojom.Child", "content.mojom.ChildControl", "content.mojom.ChildHistogramFetcher", "content.mojom.ChildHistogramFetcherFactory", "content.mojom.FrameFactory", "content.mojom.RenderWidgetWindowTreeClientFactory", "content.mojom.ResourceUsageReporter", "content.mojom.SharedWorkerFactory", "IPC.mojom.ChannelBootstrap", "visitedlink.mojom.VisitedLinkNotificationSink", "web_cache.mojom.WebCache" ] } }, "navigation:service_worker": { "requires": { "content_browser": [ "renderer" ] } }, "navigation:frame": { "requires": { "content_browser": [ "renderer" ] }, "provides": { "browser": [ "blink.mojom.AppBannerController", "blink.mojom.EngagementClient", "blink.mojom.InstallationService", "blink.mojom.ManifestManager", "blink.mojom.MediaDevicesListener", "blink.mojom.TextSuggestionBackend", "content.mojom.ImageDownloader", "content.mojom.FrameInputHandler", "content.mojom.FullscreenVideoElementHandler", "content.mojom.MediaStreamDeviceObserver", "content.mojom.Widget", "viz.mojom.InputTargetClient" ] } } } }{ "required_files": { "v8_natives_data": [ { "path": "natives_blob.bin", "platform": "linux" }, { "path": "assets/natives_blob.bin", "platform": "android" } ], "v8_snapshot_64_data": [ { "path": "assets/snapshot_blob_64.bin", "platform": "android" } ], "v8_snapshot_data": [ { "path": "snapshot_blob.bin", "platform": "linux" } ], "v8_snapshot_32_data": [ { "path": "assets/snapshot_blob_32.bin", "platform": "android" } ] }, "display_name": "Content (utility process)", "name": "content_utility", "interface_provider_specs": { "service_manager:connector": { "requires": { "device": [ "device:power_monitor", "device:time_zone_monitor" ], "content_browser": [ "dwrite_font_proxy", "field_trials", "font_cache" ], "*": [ "app" ], "font_service": [ "font_service" ] }, "provides": { "service_manager:service_factory": [ "service_manager.mojom.ServiceFactory" ], "browser": [ "content.mojom.Child", "content.mojom.ChildControl", "content.mojom.ChildHistogramFetcher", "content.mojom.ChildHistogramFetcherFactory", "content.mojom.ResourceUsageReporter", "IPC.mojom.ChannelBootstrap", "printing.mojom.PdfToEmfConverterFactory", "printing.mojom.PdfToPwgRasterConverter", "service_manager.mojom.ServiceFactory" ] } } } }{ "name": "catalog", "display_name": "Application Resolver", "interface_provider_specs": { // NOTE: This manifest is for documentation purposes only. Relevant // capability spec is defined inline in the ServiceManager implementation. // // TODO(rockot): Fix this. We can bake this file into ServiceManager at // build time or something. Same with service:service_manager. "service_manager:connector": { "provides": { "directory": [ "filesystem.mojom.Directory" ], "control": [ "catalog.mojom.CatalogControl" ] }, "requires": { "service_manager": [ "service_manager:all_users" ] } } } } VmS8_I =.!5dKd;HrpsV2/i=)bgV_hAt&sɣXZՍJ> :'uIU`7*L19eA2`dQ6e2eFs t]炁Kc! )fyJdp|zrʎ뢣_ԝ3[\5ͳtG4D ͵`~iFgP P;>TLr%xzݒuWŌĒꞇ`(?$ZQcXt{~h4qtq&RF`FƒusAopQZ<qu_d̝r6s,ՄLZuOx8q*o֒TnsA2J׭ n"iFkwPjX.p͒z鵿2wc2e)ҿס .ׂX: Vr)(ѤneoF;#w}v18e-;qϏp6biөF1^bvdگvEk68oxemWW7I/>Ӄ 0֤sUUm?twSGܯy$a[ | Z]{_wn'||s}&YgjC7/.jWH>Ѡdbk.cDנ cSѡ&2b `ҡ "X¯v㽱  yM9_5n W,H&$ƓϨڭ.^”Br5!:jhLQC1IXтR,QF\/MREl$!r0XP&.$coyC,B=3\ f ߫+~P#ܴ=\D𤑋Q`Rn3.̤SŤ伌gxԼ ԍE9/5OnNGi;Kʓ&h"! E|Yde:}`b;'"Ȕzqv0*qR^] ^2b,YK^8X`W%gUde^gQs_{^dȣjrd+r2F<^DWuA<*jp̈́ 8̓"+o)c~4TSŭ/B-,AJ 3&iw֚ڼM|‹*%:LL 3yY%Y$6.!2: u#]*A]͎]lwurv%6`>@އI0(  9 lH(9xn}C ,4RZþ4d*1@MRi3Xɼ=gyh{+09 >LfX6ψ8uV٠Gh[acӭO]?I]mQ6#J[c >qUٝjdž dK^QӷwsF_9 lk c*N+xהFH3Hߵ嘔 %JX {bLfkn5=# + <-,1i/` x0>[^&y- ;gH$؝bjo 5gcY騶Giŵ5鋢{G.Ѫ/ԜHUM.]P"H^+o1O2^2{-h80n)bWgǗ^/T|$>.ǯ vxmFF;> Q0[,:"GݲcD< vcc\.^\LBH4MJY $}/d|G#VAUMϰ-곭/W=7 臆Ka ':heA yfIlcV!P5&!Mrqtp~v<[JuXE|r/ z dRͿA3pߟv!oZJ*My4$i P{$AכQ8ao٦`v#>E0G u)m 7I*7b0X._Y8e͊5CxZ3:t WP tPihk:aY<`u&XX9 #辶Yft2(CWjC{p ' wTh4*6QD!  t43NKRns~u41*0YCYs /r[3U: Cahן5a,&rCN0o=@Jh/,V )e$;^]Z ޵E;Sö{hd*̉aķeL[+@L)wA ur\ ͝aQ 8ghfwJz+!/".噍 #î(<¬(&Bg k`E;Ukz{a}TL:Р`uNX&;Q KXᨥp9?B&6OeؘKXY}p>Q%l kWS"[8k20ZЄ> ] r q!bV[C 778uO#j`jAJS*DgARw+ 6Bb ~@ҕcu~i5-P.D٫5æBqK ȳlss)V:bek-4T0 6WPٞU^QjFwb0L.%s JuA)%xd.l)jug( A`6BmNo= EMfz ɠzyzk~{OOi>l4!Q8Hg LaPε=$:>&( hK.iRU#"n4%ЖX&cHJ P T7ڨDr}Ԉ%w,,;d,%UHe;tI>KŞdQZǭsw;3šw|7uT>Yk-|6yj[ Թ$:~ B+5Qm%+R@k 0$LQ%Oڀ2vKԿBX9ELMPs]:TO)`>:xs8<{2+Zv.[p:1;2T˅ewNĥ,0Y+?%E:31ZK8ڔ4,=:G!ZIRVu[[zd26ItǴ't5$aJ\ٺ&>w%m?=v"cyν‹4.bL]'wK/|,,3(֮}XJOyvl 6Uc뀵R+Esϱ2An%N(*bTu:\]wYhYW9Vx}Sf":.| %lGATpUuB{uJ􄗰Q't6 =L\s%1LT${[M D 7'P n AѫزH1xT 1 '8=LtIϩoZrDFsG+ԾԸKH#$.e [k/sT]to@r9Y$$ (B*ё,vCJln 5\ԕ"Z\2 ]a&ZQ4؏`%QbYGUhbMiIX#$,c͵dZ, ͎J,&kEH |kb}8J{ocƫ|j%K@Oar+= 1PfvV2*Lš:oez<'1Zcֺᘳ|Rݢ8Μ?+_[),@vs7{e>4pF8-]Q8w*Fu<ЖVf6GOͥE46.Gz͓JL"R^qsM3!6;~^g]dCNqܮڞJ*'8KCBudvIɓ{8.F^hj=xB4\j2S?!q8| @ڕ/[^O3$D!\1 Ih0Rs=dw*ގ+B>- %KWT< ,pjp8Y2Rk:UMo0 WfȜu֦Z`[ ue:QH$'Q8QA|\1;H}9tnBT \•PZ0h,1O^,.ͅ+Ȝ%9dk`ptźD47g8SG*tr~Oo-ͨQzBшk 9|E4&1{PT;U2 h'3xB=$O eW"<t{5ajQI oXLʌ7)5n& #c7@Ik6*MhudBLSI|)il?Θu>M't<: n[oǏjT3oT=ej.yAw{AwA{+r!%;ΖE!8<^?Lւ>"v0wtD%5-VjKf;JIlWŸm6H'7nc`=G AM {채[p!?~d Ç !H9'цf@x, QN1 yFt[NEj&*ۇgcx W-/o7LJ;ṍͅEGhֆvbe=>Ebd"iUʍ!BKc,G̥ص0S -DO6L< ;,= B{6hK',Ъ(oV5s_:M2XY.6+6,GMdHɣ\ $(؄Hyis4m QGv)$@#bldiN0D{qHP#\h>7ώ֛S"Ŀ AK73fWK~ts.~8KCSS&m*gB g4!d ŎJɢ_x~Xj舞6Ґhc /|5vJKS}bKb?-e228jBS꠾ (q1&mciټ"~GQ77ȴ8VmO9b6Ai>+WOU:Iև׎loJ5@9$V~&ƈeûc0ˌEe2mlRBY0hѬ'd,^˄ "#qhro燫36A9H9z.fv}p !1 |rr\v uhN!g!%N&њ\O{Dx0({Gư͟EGEXϏ>=BQeGFpV9a+OWlIZue_0wbl3otӢPZ:qδrL(4(n!OByYᳶO; &]@N8*uZ\$%(bh 8|vVz3'> rߩV,QK+&k!. x׹[IaG6ܚWJjB5˾5zD1p{L[]v&Gͷ<q0Tpt+?TWh5Oz4M/0^1Ae'tY*Ha&sISxoZGs&d[UV5eYWwxPp?uB#3폿 ߺ/H͕aNk4' H1a]rAk6*l< q;KB"rR/oz0rs9m9gsT= ۸6 4^U|Mz.d,*<%ҨW_p].LhQ<n_%\ 9 `4;*s; ֐Pt=ӏ`;9 . vZrJ|D911;1@Ei8ƌH%~i[)`L~q@vqS,!2y72e`a}ft#<vS:|BfW렻+4Sf|0 ,-L  F'7Rux!)l ;"2{r-9u v=p 'p,0KX#" )d G0P!%K>[<3$t~KN'LRW,)P:7;,nȾ@1* L{B ,"G {]"v̛`?aЧ`]ܭ(XLBMXGէ N!̩':Y&FkP$AD_FqN4at98}W7'/`C{ ׸~hx}O.z 6?;דOU{ѻ9iH>Ύ{猾 }}GI~/}d1r狕l;QYάeuo v5opl~s%I 5?/_c'0mOeta.x{5~H8̛0⦕Xp1gvKS;hfY5F&lJ39|sfX}iCg<SVI,_r#Ҧx ;r3Z* RrV/p1RLX:"Tų lz<#ߢIF,mu,a#U&YNBKQ9!Dȟ|: m@Bl,hZq1Q]Ec44wQIJ9A9^@G8XRvV^tTUlWun?6־ޛ8rimǰܐQw\gl̆\1<2Ƨr8?Q|b$V3rd048 b@692n 5c (Ux|d4T|5,q# ۜAxL8b}Eؐ*+3t!`- {˔$!(2ou۹e"2dfr_f.By5nfO'Sa_d5.bX1P $)nY}*\r@M ,(#S4$8A3ΞZʈ3L+D<<,nBdIdoօ>L B(`R?e{. fv:wm(/&3g3i5ŭܰV$Y".~hUfjys@"lS(I+])B΄7tcq+,)hBR4#Uת!bFK%UCL~i"w1P3w1Qfn';jLzzL<.e"/RM=7L & `F$m$^*(Mf[ A48Us>/l!Qcz4Qi`PTt^K_7}ko,9lB&ж suvFvϲ9aS9JV-ee(l0rd]ai52nic5?Z2QVd+!;(D'6K0- =c6"@e[\mﺫTVQ`/4Ufεd> bepL)Gh@)X[!jgS(]5٬QP\>'O7*p i+Vk P;y, RJ98͈ѧC%3~ II-5ҟ ҟ ҟ ҟ =A#GtHf*TG FNϐ/qLΒ*u)%ĤgF}G|u>!7=v|` J<.0pZ:!7w MDovutlͭ A0qSPoUI}s'euB)y07=䥚k!edrFև% p,Z׏9\A&~˫*,%{]pLy]yq/J9mȰY~,sE>ˎ %_VeGBq쁖b+Sz^3]|{HT^c.2F]?K/_ JjJ;ksȑ+ƾ\U]I\dՕ޲U9* ɑ@xkc$r`@OwOgxp fij]Q8|r-lUnIY\$jK-;{⃖"]biRi$|]w2Od$[7S]lc)baDL˴L"x.۳狹XX{{']`xtaQDl-HEF&a!>*&B":64x+4+`5 3. etiPaYY _1+kAlJ.@!`"%K%\bbbm"UF|KDH8]{)-G4jˇå õoi}UK1jK%uCm]5^[#Bk,@7]E *(Wƌ|/P%(4ұ r>/*g 8@3 *Qd|ɢǪȈJPQJ<-4B\z틏R$-/,A߁8%aK6eu2f5 "7[TQGI ɠbW˫Z,S~OC; q"DaȽPST ֭MOMJx=(;/ HrVeƏ}5bh3i# |8F igiRu_M]y UfB5k˧g Yp#F Jȡje׭s! tA&YV9jAUUPq0pe;g|ƆԄ؎Ԙ4AA>Ň3fdڙSp!F ;;]j7vֶ4E:fijMCFpp.,-Cɾs(A ˓ Z ϬĊ M\~m8ߚ``1=#(#oFcQ€ @d!|8ȡ.7za( c(D@2"4v]?䆬-~ŀ#-VRbUf ;:ǜhHd&@ow׫ʈjCCn;6AJoqE~9WyxƁϝu`=G!ݿT8Z_ ,.ܩ{ػ{hO?y31gE'X.h;1)hg6l?oH !ffP(*dH|RE6$߿SZ-T-z 9ۤNKN) o2s5W/ݬk0re$E L_4\;(k1 bg8"iW G2k9kǿj0ULy.rmzx\H876QB"{<rk$T kUQըgSPP„^W<&i(]Y;rZdM>N$f8Ah6+qlK# -3>VOK|c˱z81ciWd;럲M|-*M]$^xlCQH.e`ͺܺW`zgh"O˭w )`G}} c-C}6kFZ:Is7A0 A}ܣ/~m'6ig|YrnQ;Bĕ*ʔp=d wuwc3ry]]G>~خmގA,/>bb_xbs"<,νgڰ28A:j#m_\\+m YbQcҩC0gvZ a;';qYo?f<ѣ g6,:Ǜ+:tWO|$锎30Y82+8WAS橌-jnB n!znE!se|~~ͻ?חg ?_UÒXB7_h/LbebI@a,?p:NtguA*v;5Q"KtMU[24(c[x$fͰ 6ufn+عBL5`F ?2烸k ;E7#l`VH3"}9C#:xeRRP00p=2^U1Ww_O}@ w%>*NIsAZU%E{2 !_+9DI%_=E;&ElsryG$)4LwA\~>hnC g0}'C@>xZ^l.h1_Թ|Wm ;lPmm,== nz0udּd$E\Ϡg변'6S`- NH?C UF w8$@c^x.%iJ4rsqSGgǶ,)UU5XO d&.+MR}&YכN=" o]>(9ZG;Q宛 LOEtnF;jӊC~m{v:Ո{C05>$ Y{Vu 59|sUň3ꑊ=dIWׇ$^h}LڭEPOͰٰBm ,'WH=dZƜt]+nlTdi#ASsJW4k۝ Fμ_2\Ҳv AUAkn jz9uA9 U:3*Wg,MDCݹ omYr۸0Ӊ撋"kq|g|q&]>y@r%L<vdG+t4IN.Iʞ >Ieb%Bf|66oRz+0H242`6N/ hId(Reѯ: ǿ`6ͳ9:#Єx[Jed (̏m9 )oh5)Y=J`OϢp"˵N  UǕɤc8sp5רG~r&j.50x{.tl! :f2f ab)pAg'/Oas|(>(Lp L-oF0}ʝ*m&rk9Xedgڬɸ2F G)zq.7}j k*Ӟm˰diK<+:̥^<}uBHU|(̫}X-cR.Z0KoZWv)ArvQ8 nr N# 6β>Kf0 zi\RdB K`PVIܠR$H/-sSۿk8rok3F<ߣYIur.iQcCwF<= gIGqESTrrV6_BkXrcJXq=sDey_. mP!ّtYOíe\2VkY*f_/m4X+k0>W|ďӴOS]۞T cq zZ4.:W;oQ};KLk"0N#nxCr /(#ZKnv#sRbߴ)Sj#XED jJGKnC*”z%H/ma;8g⦣%ӣEƚtRHR&Q3O#Z}vj^4]|:xIM֩Z樯!w Йԃ ՂКБ_ $,(C Csc]5.P&,_LaP{n^",`.>}wWu}`ڗҲϚ<0[St{|k3pU/>x|yՌ] a9 [@u+wZ}/|{TVl8aSN[|J-/`&)p@{)IݫjгFك9 ^Y dBC%r^PIwǟQˣh+(zɕ' |@ezA~pezLmuلK4 K ;'ޭ+.fzr#*֨,VPi+/6(x PZV.xX ֢-[8vђh+jF羽F,'G. V#Zg\KPQVNXN쁴OQInӉcօS- m!\ܠ~t/WlU;hE9ْ!#d)o2ӭf9}Rc/-)M6q%>.7p{m:]|Am|aUK^fÒ:KՂߎe{.}ip%Fwl:b6뤄/hl.(x  /EBH{OgBDBEsxhޠTXoWdY{6^6հޢCz>O;P_`H7xKYv`A,LMOGDT,@ѩhq:HB֧͡\[S f)h];ۑS4O"Qg_#x&Ʈ,4.כ轳_۫>Dφ߆5QuŻ$؝?J9)M[$W*M଩_gC*{8鿐"%dL,}4k_d,E6lh)w.^:|uǔ ZMSԹd)yem8Ŧ)/ly0 {G\m ϶*QswIgnJs>us un,*Oljϔ$`ZoۼQr+O}JamR4 (Zm.Q]A))| Eߑ9>fTr2,Jf+ޭZjTft7Yhbɴ(ވ4R0`f%KVJ'%* Tsq|R]&X&2%?> ^)-.es ;<0~|yd!EQb[ w2 ||d2O,tſn!1yQ\w} F& `o|UbcA"8 (K@ȏHrebG0t7E@ZTlFi(ka ( -ƑJQ-Wo ܎c`M1_D癸_$8^1% QWY|[Ca tVb 2Bu0@Bg$crd_gNx)بu૟U\"55CR=[u"?d|J4aU~6)<$^kAq$KNd^YԤ䯝ґ噦{rpݜD &N ʇUe!rb HxileQ l~aeiLm x[ 2Ie?mjʄ}8$ duT0u$aQ ?;PNZ"=⮤sYyF}"µ p# H^J46-: fFſ{>:ƺc>'cp-ƫV9"x5ِmyz,4-g:$nid/'q Ҋw\)_6k TK!ǠɜVKcD}빎Rǭ疷/x^{g<'gqjݸ7Z1LoV$ XCK?Y>'e_cdo@]@ H[4'Z݇ྯ=m.T{|T3f)5[⸧g33ڣg}z(C0@}u#x jg?3 ZTU|Ad#9קԳJX NGP+1><"Zp>)KGh8SwO)XМ@ tuBdt:۩`gW]鉉0Aj wA:߽t2dqUU"Y?\퍎"q-͵nm>>MdTMϩ9pds3iՁۨi:WqoM\p uFI_xnϭ[R8^4hpo >{:}6MH륭"+o )`_"G}3怾r[*TtFUԿxs<1ogf \v~tc+hb/' $i18n{title}

XS6~_sۻڐGK:}(&(G9Ndb. ICۗ$[N9Gi6|kb GL<\ǩT r(BHP 5k$sETH2 w `d0!|='$1$ 3LC gGK\@i:8~% \W_@~AST*7CG7pZ@p޻$=Ti"*T/-bX°F}k)?Rp 4Z5dHMB@MA6}1':)qk(4O+3wd\eNZ@ѭS9'`[:zhVOg4bG=N`ܴQ*R"r4xno5Hsw{ΡT$֣uWRʣj* /k^_F;_\/nU3 Ë՚c$NzjӞQ?=iބ}4F[aEN&<ÉfЁ ;Uv͗v[0]<[骰.ňRWBm7x:NǀuT̛9QVZQq|MM{_Gž|{yx?^03»j-7ѩdl/0PGsVPRޮLk"oۦ { ~`o(䒶й!Lcӄ=,J=sod-~nT W.fTn0 +` vvHCd@l+ua(9!Qn!>Z'6_,Q|zfi޾~dL[)mBspN4%&ao4[RL0!V o7D-1"xv9B.b ,"# knJ vliTzLDߋ+iJ*͝4Qn!V$Y1ELޤdž2 HD0==c[A-Q,JPf .VnF6'0iN !|kB6t #|j͒XikYhO!BcLJNpIk=6"6dY[ϑvdk?puk٠m)wm=!)UP |_)%pc.G)nI0NtQ8 4WNmK̹[12ߟ ssDqSBPeII~(J\r)SmMC!mT_\rrb8*8gQ- UI'QV/?lTQ8<^EteuRn0 + ֠v'i1Ԧ= vXZeѐٰ,7E6A${|t1 {oZPK6SgCBPW@-6 ^"HR1liޡfno{`Di48()l.i] L)|1]+H span.lazy-image-placeholder, ' + '.mwe-math-element > span.lazy-image-placeholder'); let noscripts = document.querySelectorAll( '.image > noscript, .mwe-math-element > noscript'); // Next we delete all the placeholders, then move the img elements // out of the noscripts, deleting the noscript element in the // process. for (let i = 0; i < placeholders.length; ++i) { placeholders.item(i).remove(); let innerText = noscripts.item(i).innerText; noscripts.item(i).outerHTML = innerText; } } var map_renovations = { "wikipedia" : renovation_wikipedia, }; function run_renovations(flist) { for (var func_name of flist) { map_renovations[func_name](); } } Un1WL lS 4=:16{JEB fo BK7,aVmU[u K,:D…sD$k4 +!pm (4Q#`o=ǜujBZ1ha\xKj6|} py.rIGb=4(DϦ,wT4lz؂V!D/Wz>t CO3e/;<|abJgt΍{P=#.݉&noVQ-+ĞS{Oog?qbM4Errgy[}(xz,:Tr8E~csW ?vm@jp1T)G" N0VN#)S-ղr B%&)(Vy CM'@+&r86O k¾Lƾcw̃imt~r$Ʈqϊ2SFF:a P1/q40nY;LJ,샤r'2>AL+ tҀh=G/^r"LNYBVOْIҭvۗon~Fuj0 } IMءK{(Qh*-&^z[U5o: GPkO'OɇVEc@ߣ*U_Z`m^"HRGPA3zxHtZ0HqSK)0.vzy@k,EdCR^M^=u)NQ[.z! ֦wx̳T/ѱ7- L ä(R Wi)gtƪ\/G8vy}V\֍
Y[o~ (6,47{Ht}ȶOA85"oM"%jz(^;t>C-"W5AkΎtD?d͸HM$8?2BG*$k*`'^T z`τD7߾ЂLXhON;%-??O IIJ֢a/ %=Ztf5m;7ԓ5 ~J=qwp5T5 ˝VgTJhkmpY{EAr *)kwƞE'(YCMw(QOD`JZxկ%}b-nH%tˤhXdg]$}&IǸ0~ĴM*$٫*_YK $aUUC[2 te5|UZ!f-wՍ6LB]e/u`I* tj5 ir~`+| ߡt?d:@"zmIEP}!>If/J i^V$5Q (聑G ;&YgEL*J䅖mYqY#m`Z&:\bt`IecrXO)]$S\m|֙MkU *o;v-뒳mM85*ɫLJR0M7ITnj'W3)fsoՅ\1`ypr$kc 2ɸy@,](76blK*P뎹w1N7VӶ;_Un+jR.a==Ai@R*@P%or'l"l Gn6F B ӭ݋eG'4ޛY26  52]?sL8)4h`R*JkgPLNz-҉;/ Bƒ_`~<I {P3$=1͎lK>%#Z顨0y sq:bs]Uo2nz.w{UeFsYu7u}번ZY  Interstitials

Choose an interstitial

SSL

SafeBrowsing

Loud

Quiet (WebView)

Captive Portal

Supervised Users

$i18n{tabTitle}

$i18n{heading}

$i18nRaw{primaryParagraph}

$i18nRaw{recurrentErrorParagraph}
$i18n{tabTitle}

$i18n{heading} $i18n{openDetails}

ŖMO@UK'Tٹ*J.=EkwUIp[B*~3Yw_ϧo.xdt{<9?  ]Qe xHHƝT:k;r쬲Stj$"YQ y@K)8#dd,;;~'I`Nxz}^r,x]`u٩194/×jSU~kBZv?TU5ƚNNߥK^a;g~΅)4=haƩ']|o3eߞ #Q -GE{mp=.jIDogBDsg3.t,kC"֑e%Tp5_Et-4qHQ(?2ukޏ'#HQk@ )+ai&}b=4|B.[ii !XO:I1Li&/>}n i4U !<c@E ch \*!dgN[5*-5: B1d k5UNqr\L7b2ll69]N@TErr|C<_803zO~EDi<4ѡLs8JXj0R$gÌ{x}O3Z\AbKJߚgU#_YTfqv!|מٽgVP&KɸIG/ph;Y+z7-[[pV@&HT*GLhE"xO˶py.9$wJ\FGË wS;ŕljk<կq6ƣ~Φi6 Z9>.Yk#1ܭ}wD#soE/˥6k7ŋB]"*enN )ș(ˍw@ $i18n{blockPageTitle}

$i18n{blockPageHeader}

$i18n{blockPageMessage}

$i18n{requestFailedMessage}

$i18n{requestSentMessage}

Rn0+FBl)xOe q)|cOkO8.vvy3f`KFb}mC 7o9={Ty+#P=48 I!{t3 -ц6RX(12U4X[VYV: rWX$rF{܄&ĸ"Y"uQP+\-bβW4xtvJ0 O, EnZu1cs|'ayX'Ҷ>)V: !>,"57DZوN{PUO Gz#؈ǽg:8"k)R[wBRKFj1PAhÐ3~65TSJUDH$7OP9[NETR ;‰Lmˡq. 챱6-YJL{Mٺ}Y!g>dT$ P'WM WPu{[\RժVۏ+"0bc8ݴ^q΍yϏ+9k j$WE6+uEZ1R-$DU)Ҭu])%Un̷B0Y2 f,*m0_\q%*XGr~Zfm_;dP^-@Jyat 7Yfp65 qߚA]ɂG4FM,7Fb Yfmz*Ni&(`.㨽/!ƙ~MRMFvuY4pˬ-$h\BBy5iЭVw\ՓsmP"$Yn i٧{LJǻP =&eͪ}9]z,-ǐFA˪r3'owmlkƻx hK+f3m@u*X]+ə4 )Xq ~՝ ;f8yf\rT%-3=H MEغq/\4qg;錩+O[Z&/w RcT;$9Sَ} TBK2u2OlV1ːLUX0+ !Qx:NIq'f*A5 clpҚa1O3 ΋E†1~>32\vaa:9|NIoANRH!)1L-#ew}(9\k^+^#^S7rp V]o8|$c: .@)j_(Z\Yl%RGRN dKIlE,wf()Ub[1XXT)6Vp$P h47ȃt r"#ZmPK3c B"BD12 +t"KB8"`0MOOGp s$++p v/l\ $XІiPҀU \k5JDU.^P[S*;'4Ă5X`+̘f)-s%-JK=Q/ sVP;Vy%ll~&`a\#?ǭ&jF_UDLw-ݹD?UHff]>cK_+1-.XR UD)G]T2m}q5o*4Ԁ ޻mUj~W]GT'%q 3+(Aq;lUQw^mܐP~b,$zscxEwܾor2zb .˯9'P7ø؛2ĝ=D,18?0zh謹W'#pJ&#U@~4=0|O9[%rƳJ|a*.J[Қ z t| O):ytr l N>(QߕgN'roҒLo Xmo6_q0`+*;I׮YWl@R0tPFRb}wԋ嗸v6,5V7֍\),:ҁ3M"ܢ՘B?\9PJ&IC"48LS^"xȤ /t:8- Hraa0,xNϓT/B{B ;, arD?bv6Lx8ia3n8^_;rK{7ˠ??SwQ$Q ҎX`th>D!bV ."X2p/I9W3>RGw2 ~U4z{SL {0ŬPyϑBv_&[}[~QmBdld]8gL#L6X*h'F;YZ`AXB JW*A!6qIG~lsLnb3nJt$=G4A^S,&,8:݇kF3v [ ݆w bEw0hMՆσ:^j(8"Vt?m_\8 nRsvNuLN,=8lGJ{R {jOڑ /bA$^}E!ꕗjpD|u%haZL*o!Q9B^RV6|2IX(X > 7,d4YՓ#p`hLφZxyÞpGP9R ŘƋVK>1c=':3.Z pUY{v.~cʴzژlCJsF+2R{k'A:#Df2apQb 㽈$Yd}a8[M꺦< sEfs,x0 z(LahŞgvAe7[7umܲܿbgí/hb =C-@ ^&q[eXza`;ٝc%4bJf4?^#~dy ܋<<`_͚}8a'Ō=<=]=,Pkkɝ{>C6^yjڂae9 B-֜<:X7[x!Eݎ _Q̳sO.3SD|8FMNwF@vB^:bu! e4|5"{ևm2LgރZ{ JT:ɟI(T Q|E5U1WBm&Uہm8Ew\g(|Y6 **Zpn@1e4otLuk?p*Up@cXC`ϣ^ #^]F>ESO7Jl^Ē uÇᔟb3=iP+<=?+}I7zr&?(RKo0W"ivKaYz@B\ 'TUNk Ka(9혾bĚ+Vܜ3$ئ-$'؅QfOXCAZ"F#ɵJ Keyq.9M_N_9hEcvLp6&Y[S#7~PT]x0$즊uQrlkhs.jw6Y\ttGNr-lIɻh\/s!UBFE$SL޳,_#bJ+D)SFR1gɂed&|VuHSVSMRZ CMSQ3r~vrzy}JeQ`rs+~󡛏ýȂּػM-錩*oQ8З9Wfhl Ib@Ÿ9Y1sXݭcfH۝O7|\\z^1\%,GŬ`2Rw" ^1ļ7 /t|0WHS$w1$Ea%ve\Iβ {RC&tru?NҜ*iN sp3*ń?t.8Ono@譁netp7\A6mX)VhVAg.~[KN(PПbv>]} ".W$?ϪhZPYb ٘qzLc;븷&h4 Zq ]&JG]R FLJ!kjE;", 'b*^vc(]29DSzϡA\_DaJ_ :+Qs[Ӏ;i˸*B݉-?ptJAf74[JSvCh%Q߁Aj|5P]!֢&gl.xS)F92+oYqKju8 m gWLF}Q}O$&E oNASQd 9n15Z-6^1o]shEo GJ`Hs;9ʉ:Kw MMgyΗ /i񄧐\fCKvCgpDv1~lL#q84֠34|QȎHv§'B,-An:4bZv~!v75-9cvNYbUNfSIK)^lGG3VŒOon;@O߂fSOZP ֮dNq{1>Xy>291 vk"yCݷN%o0nZ󩽴NDp ^ZYRJ6CxSbQ=F4^[!U}B'Fn4x" \okP >@ .ggv 8o^Y;=)PyW*3?%~zDgX`T, ƭW.Wv+έK~jF&@#2>̡ m0r`AC"nk:C6'POfe7,|WLr\(v\ 9*d9(6\@捡[l_lFs_<5TM3}}C6E)DhV_M;7(:Zc~lC-4'4é rbهJ x#ƪy |F7&|mJ&D=T2f9KD~kے  Ho7m±;X$oWOhIЦO[8eW1+k$EV RHM@}HzѲ0P}9wW9>^]8 n64] XKo8Wj4ʊ6=mZ[LhR i;"}zزItOC"f83w9WJilIwB~@cf|>#gs+mL2^KDM!Fu$R .jZ#O+D$1$M\2%|8dt;? ^|_??¸z{^pkq JyDP9-NA |$6`N^e0:Ks0u'AK]21Ha2"A0 2&tl=]Ē)-)Qp Ert:]$7ٌ~it3)tHt|?7N oU^r RפMz ES.VB6-Q3 PƸ8[OL!sW[fWTN:r2ܥeN-_@E\Td}﨏{GDUb?*6QEm"2$1g dэ[gh2 "ifT O 7nk#2IhiRENNȉy>蛚#~ dUr0%f`4=-a3*?E5ُZ=' _5º bEpBA2ԝ ݻ{͕urqv}Rm3MPtXI7^Z`&t*dtwEǞM q1%3( ?3p6 x-]s0CPq.t_)ZĆv q! jLIM^Klo%2Mn)ό.TbGċ")·#m]?@bw;Cr!#5*εo$S\z9G91n{ ^VQք+7e+Z~ssPYpWcn\|閩oE15STBd^! KϧussOriŞ }5"9Gi ^."Xɷj8 (6d} i;p]mz;3a7Zd\—Q#8D~=4:$aI>9\qbf9YK"Y"6ߚz0=LMx|զkXW.xݢn)yӹ7[lR\e/// 3nKŐ|K)M 5Mn8v[]wQΖ+Gn w#;ܼ_U7FehS|rtjU=rmͩte( j0ce*e*#ZKmZ\e.\~{Q#[HT(;נiXbtAsE:3;el>]9%ڄbɾM*v8b5Q*52/>Lvr]_V38 恲dءŸh4%,%)Iv}uWdP6Uv__;.(,rl]/ʊE, bV4όrNE+UBIR]@vCbjxMNI%z$ rKҼ\) Xd2_9lA2.9e5\S2>i p\HF8ȥGVqA *񇱊?p QB珓R4r=U .7N-q.YbUu>x3e/~3D?ںX}V$GSRh !ٜ{V4?O'B@-@=@50U!Žk|P+ ,3VÁ8UG'e HCՐ,kC%ErFMdE59=b̲kePC~!nf"wœn?<$ pҜVfAP'`j%Fr өt6B-'nҔۣ8ʅ-+O^pnO^EZi>a gk5$8m8~FE1|*8ermmP̤к?h']dsͺM%_0S6Ҍ^[EZ!Ej1Y;c)NckMlgl71 ejZ A:/+;) }VUBW5TP{%6Nw&Ĭ6~)" zȆ`#}L~<qLhduЋo^,2#r0V[=MzooֹuBԹI}F!Snv=y_4(W,ޕh_#ډҾorzQO5q)n<>ȅ&d7bWM+ow?F~@z|HE؉`mBx 6r_aq&˱ _FIAd$q:nݱ)$# j]Ŋe-mn,h1<\/Wc,A-!iyXR#W0`_o~_XV6mR˥ݰ6K` 4tGM -0HB=dU l Nv Vs"G`@q|fᐡ`e;/m u㫎;*a&.IreK<= x<L e9 ઓ]xP}&w[N{X] #.z-q``0t)I \|6!/a'Tn0+5BG_rJ J\I).AR"^Qv"@jwfgv)l,+I/{,ղY7{Or`ѡݣM` ?+QcsB,iV>=~f9P+!2 jC÷(Lo'7&y5u~N2JUlOHXl>uydZɤChUI ěE_RjT2耐 1ÅLa>|=k) JM;+x'HkI/Ia{l! ( W$3ஒY( JQ40vS+)TRgB?4b oMO?Q)itݯ 0gx]~kvNĂ{AF< {ԩXFM/UK6lX”,/`5ײ@iѫ>mN^…˦ 1IFP"p_~N3O~[_ =[A.4-PNG  IHDRaRIDATx^SA 07;:usKHjtAa%81d/T8|!姜?S:[üIENDB`PNG  IHDR D PLTEVtRNS@fcIDATx^I ѽYJpNBW+JpT g, 3 2 s B}QIVըju}0cicpx3^+o:IENDB`PNG  IHDRJ#+IDATx^10Ec{.T¸L vqve1kp #"y$\^#3tT *ath2um!D`(BW'MB#bi@sP HLT*3shsãm׷3{}\#:uBn|USgL4ݾM]5ףmIENDB`PNG  IHDR..IDATxO@p.p'eNZAb719#,xI1 lx9@/Q̃!rP wDND=*HQ ޺i$t>r"#C 6t.A;{\SAi9$(ފɫ1_U yYH2 UϨf̎.̘ԉa=KjNuJՉ]z̪PIrCR]gh*l+}` h6Y-5ukZOe Ջ4ZuLK}K)N'z_ehk(ܠ rv9=ʷ]Fϵw~q,K3RStɰ-{wq9 I&Q{/v3`L_DZcN`j[bttIQgOz fXQx$ Raa&X ,sN?̻R1>" g=Bb";3Vc= ܠOw1M]KDž$ feoMSAm{7鍂i; BuE|?ԓҩ=udh_ \~ C< ܃?s v g`hYjG:uf0 H^qÒT|L(> 9s mc|C&T;v w]Jnyksh+N1{4]k)~.wuC ȝ +З6iÊF J8\&n<&;:E_CR H>`"- qBe56tCzЩf(k8mmP=Ę>r\Uk_,;.;D׃ukV` #OdNk7Z S*ݚ nr~jJ-ϴiɮK,&|.Se,3,8ʶ Zu9|6_HZm ;SsO;_!_?'5Í2{@ET$E=!} *%YU B&P$TUЂRĨb}cyPlbw(N`cD]ALBJ$A** !Y6Qf g|ZoưYAF*NIo¾fb/ɒ锌ul4ev5`&dv<ٓ۶~<g[H曝20W!:˖:'xu(28M{;nSE|5yhY(8XAV]],ρ[y&!F{ĕZ ?ˋtYXd'Y0ϊ1k(*wbPolb:@^|տˊt/uW)l飖Nw;1 d6ݞA3wT^ j_-X7d'32OAb^oN;0$u#3 +p,,HLFC%mmZ9Ybin *ֱ G|6b `ggbhCCueZ.tN)w~ʮ'[lj놏XZ%YZb/pF(۬kChFCC vo0ٸhF;=7] %ag}·#P=t|bAmȆ*r_<]f{?hzϭ 7~ ({EP!2۟RH 'Ԡۗ;J䉡Cul~^=ήvǾ't252>P$R qܦƕGk#[|;[\#`S%%TA eBz1.}o?nyŬd&]9C?@ 'F6t9P\@U_Z-w9ǒ3Puޡ(r/Y[?TI<1zs ü\ iH[ȂNZbj ^>$ny2=bTߡ>MXo[ZGd=[//k|ZUMIE`B [#&AgdW Y ]92`iM@fz;1nP@v{3 }D6$BtNn( :H岗rvg_ΐ;u6x=7Ν.K ij7 1tز ƣ yjb8Si| aׄtрzos]qNuiD' ^y}7kpAZ4_?jĺe'QFEpEnC)akCx]4Ѭx;K S~d{:^1=O5]18h7סyfֲx3J{B_\Ӷ|iֵ=}s^̠xmz%[ Mx _E)]c/b1.t4} 8 @TVdI^5F`;@2 XE{[Jſ]Pݫ_e/\+BQ@ &.d/dKV39-Dn>@[!/4x)dHƷ=n]ҏ[.r.tW3VqY{|ݪ_QT7 _nļ Ji=z¹jkh~iffZ,XI*ojZVz:ь0T(i8WoG. @c ]=`RQxC]e7 =Hq0[e+@sTRAUz%<9Uq&@~l#zoyjʓ?c!x /Vg%Jg)uyb6!y4g0+0Od(?~"_µj>?OSVv{sI^N6^I>jګ|x-$8(EF5[n[x*thTU^Ie)pw+ak_jwQ7B#`m~iÍk8+fQkJMQRMo0 WFמ1ХZa΅"і Y2D*[00`vHǏGvWu 8--|{wmLf_ !PI#h S@3(x;AhlVX2 1.iuL|,O^qiW]mD. Xg5[UL/ Y*șDG.r,d#%gw13* C۪~v ʸ=eLKiHuSN@|WL%$;uJR j_/:>qKh-߻@XdΎwg!nyh?|UK-u\bu>)̆C\k.P wKRy!]6nRsJLrN' m̲~}YZ1O!gjJ&ڊOM. 1;!D7(jW%Y.T/W[46o災`h+_/$j"1TaM=(e1[քaX3W Bzn^#]Ɏ9p׊]%ucw#Um=.6Tc`1|54$tyZ0X÷-xMmhyi.#"oH} |;L˫W 1,yѯCA5:J~fP̢un!z~M'Y%XZ71%@N^og^£w:U&>5/{]7]'0@ZO.r:6%VO.<~/ZJE {_wdb5Zms6_a;'+ %ˎD4Lf^}@$&r[DI$EvA@}+*0MMF{ߑ(ezQ=åX GJ̳D(f@{=p'AW?ـ}qq EcOLj1A|1i~uߐw({N̔x8I5\QEh8 .-15TD5Sw5C3s0!א@Ru!t}; $3!13f9e*(p >a#փϴIgN㘨G0#BYb?TCP8=o?t/RQ|#! qf|oI>E,gamwi5!x("4G\ʕ.}%7$MVw"s(s5Zl{_e`,kg&L:KxuIr!p(:20"bbut;~m,jYiaRJ22f=W/\npvJk=v 6>֮TU@U…^^֖Fw69gg vWVڴ=h M*ZXe; ]+S=nl3mf#V'ڊ֍&bgW:ko+mGk [T̺u;K0?fI'Hw4aT&tTދHЮrV-&E#nzjgW{4 02}BYvư$Y2Nl{#3{' 4xَY6Xw_K~~X,vMhqkWFH._w#16uf[.A(n ƞ#s>cJ3VYjJR6WSoG-J4F~}r&-kjK_~ǶnRCrF#ecn,:+7A#R2S׫\I$+RxR4SZoapy ^ءt]®~4FRN7h3;4aSC,)*"[/3`dFUf.`[k.jVr;Oi @G"mvFZ)Vju(Nȡ渫!ʜ2-nJOH?;:F?nJ!0ߞ_]ޖn“6]u+_ :ت+vb7ęC*/~Aw_/RX7o,OM#7أ1lFMڈntF'+|_%yW hs'!/Fχ zŽH"V |8W-<2z{6=~wUW\]E]aOfN(i0#t0Էx{\~W08qE,N/=Զ6t{ҾC[hcZvLE3(' Vn@}+FKbBH4WYZc.] 6妄=sfΜgm\$Wp4 sbM*rJuxR Xth(=?́rn0K`{h=FHskRs?_~\*m7Z)xŌ-lQF`U8@8~ocyX6 E0>_%hzwR 4l9/iƄz>M "Oco IV5qȚ 2$I}%έ"$1U5 26]IA J J"5uҹ2)NT)ԧk rcYY6[v$̜tU% \8e~7=?T8ݰ~.p]7Z#/".!ܗA\(62pL;V+`WqT,sea)9\Tyy[̩ϦgӪ$8nDhPj>uzaM]ºdYu:Mj SrU4DݧtMA=48d[I>[6G ma9ISI1v .u}"|i Z}b_ 'y%k_Joy&)6_~8*ڗlVznӬ_ Yo۶S6`,knm7` J,6(Tߢ=$EYGIsy}k]& MFS>!:-B:|sٔf~srZEE;@e]ՈqC"WA'v%~/S&l7~0t-3b ~D@_US hˬΐcHQ+B2MaT胒Si7Bm6J&m O[X'gVBΏ=)Hdi\DGC0nA7A<7[@5MVڑ* u.0zaKhˊ1WlQxA:$Y@5u2lho? `r֝Li-?<҈p A_P] p-t6\R1}9V/0N;u hp 4laM1= ө~aW> / j]\Oє@ܤP&5r::c[D =`J8MnU(W9hRĺ$)c ϴktqmy:~'o:W ΢iP2+_i48VeRfg785ူm~-Ek5f _徚O7wB!ƐsZ:S3qN.//7+-$zyFΑ-t<̶4 ѪĶz&$| h;d|y~wZ;[( Htn?}#Ț|[w!-ˤB(1"ŢAg-a˝ecϲ}(g*.4[3 z IνP_5t8k?G9 dHŌØ cC3G({9 H ѣLQJ;Ru-Lx/!Y}>5j~[j3-pg{ѵeUnv:EhUX/#\JH|vCQdyh *CH$k2{νMX> ]8W=@!uH?R-){kK4B?p5G#~WFqii2YN USMyK ܪ:n ր3<5[Jkڸ,`2AD]jm~-k g۩ikVښU9+StQb atSYAa%TSmm>S&c5r}&2VM \f 0|G:!B̙ A!I >ޑP_z!՝[w_w[m2`Edm @o/[^L85tc3֑aTs ʒ?7[gaP ?;78~ /*3 ~[CUqno; D Ͽ>(K? ;ݘ_VCv\g͡/R)Btv;nr/vȃzDzfl;fX޸f˱)X|qxI[Wϒ'anY#aȰ-n?QOGj.Fjl݀S~n]xmU9& =s:r˴T"Nv9s]glH E$e}$ws.3-rX,ǎC.jo傳EU.EY;sF@5xͫ;F;{{cY9g"Y]L9 ݺy9˳ЬY K8b"eY9{{ztͳG;;wqŖV0'-TMʕ8ME+;G"# R90zR_<^Qn>A]oBC}ʮ,I QTv P4o9)״Tf<פw5$`!w5m,Kfs*Ny[Vi;X"oS.]XY |n;nē0N̪*Wj`),>Z.β +0 2fԉFc‽FYf>BuLjG}IВ_`$HhB$>+>-؏?2AT(GaW} V(8Bt1~Oe] cP0A_-Цe48/qpOЭ!""Qy,"Zϴ9t*$dDpX.9_*62^-z!, 'ZRAse`Łt2@d R)V+rQ˘7ulqج(W͙94@ ``6s7Zs'cښ4\V҆L}AAG-pC' @[kh9%%DylZҰ եM]%:8 >ݿU8|Y߲W qC0b^ylw!T+rImZ@}â0\MQfel Hl r%cJkh)1'qpDK]1vA\-揤VP ۦ]LDTEQY8fDnc6E ևmy&NzL_pYHqqY$(6jf9LZP~xىI:cTk{J}-%P[woPS=W%3,纈x%ڵo~jo-#s>ۛ7g/oNف-2aG>>-_Hq$x?۫`7tϰ m(ٗj\Q>Jtի85 L6`QjluZ7fmX"ޚah~/:1VJDN (GWWD5ZoKӇr]<ӳF3۔I5X*][8qN1㴼͇ TJ2u'`ם+M^MHhGd|F~>O[ |P_dx-/qAT 쵖{DE~@YL]glh -vAJpmð6W?wgL5zF vR Wﲄ+6/P* X8lEY<39&D*@"kƁ12swH*-qy}9&]dkK0L_G[0df`S@&1rЮ(pKs R.h qh }Im:"0Ы p[1ͬLLP-OuݨkNv6Jx^ LFYXQBlVj1=Gd<* 5QexAtc;dƑ#/oSXJyë7* j/c`Sff6Jō M)/^Y 1ѩ@wS'^.P53]oa|]92Ȳ~zGX% Cz /%'TbD(E뷝 /_jMf'\Rqh܅ȚK|iےSB2-cKD& WL 2QX*)2bg:y6BQܑ1xtT7o|r~qsqX+0p.`> a03*7`a(պ"'"܏8C#{ .oQN L4ѳi%_=y=4 M*' `S.J.d\;ZdyZ")b眩X_O mdM7Wz5 IkzhbP*+@cY6|,& %efV ;$HR>"["Ȕz" b;dwfփE.,辷*0d4j0 )4iM,5oX M@7Oֵͫ|ˏo$S-"t0TȬ&0NB P TMӉlp <9 [AS%WC}Rߌ/;QgT(`.Ǿ^-Q",rM=k E. Px9U+]]Q'@eo[RA,&(gpL5G)iTBTyLTh'Z{  =q!G-K\\)k#YpFMFMߔ-뫍]Ǫ[O](#]@U"LjddB^L|Z݈>.]3J&n%M=6_{AǔoT b-|QO.c$Ǜ@9QMVeSoupupKmTw 5@_x©qvq1S-ґEuKCOom-Ax@Ul/7r^jYTh;ARa. W]"!N^;9>=wCٟO]i EurJ?dMNA@\n0܈ܧ^>K; ]+QV$; ֈkǦc&wujJe|Qx6bމ\@U`d6md[2kɂ+{ZUm8$jڭAFl $$ `&l%(6 8HlѨXb3 U!?3p LًYgi蟈-@e"ptdz. Xug;5̙:{jeWVJRw2D7Y (ݡ=+1'$S:lp7c%1:dXAg3vQn9[Đb} 8,pcy;m_8:Jg8.YFW,\{;Upҥy,%}y=u~JM$[^Flɕ}$ţv.)atNFC|.=m 8`y25[)^un{s_XWw ~O=3k.r62p^ʉͬL9ɹ??lP(1tTMknؔ8^nj߹FT>xmg+Ceŀz4%*B3(@E&ӞȼEsL,r+zJM[r{/JNL8蹽s~?Vjm׎ '=fED ֹ,- ,/샼K-c7Bx)jAxM[1y{F-fֱ)E[mr4 tNYIظRqTe>xD~џKkv̆܋`$\JLM2c:gʤqT~;oj3<{Xj1Yi2=TNZvbrY cAɸهyyK/,W\Vr~<@7^tmWQU\[n3H5e#/D՜MyM[nr% k:Yym{`1ҤF̊0`s-jɚUhh8h&z4fId7quzJan9J͠|ϴbMmC$ht|~oXKH|ՈPFܚ uuĝIiwpU %] : Cļ)h8qb_0Υ_wS'-=r;UyZ 4[)깙>D#iVgYgߝegϦFJU ylkcwa3p<;V<kp1LFC)WzƆ? ТP){U'9QEaji!϶o'x6U]ja2pEٜ+_sO#Tܨ识}QB%]H"`yz'%7D1 T:sYߓ9TܲbqlյLxmEe≱ e(P?S FPj{EMJy)]5^EU۾#Fh^R}W0aih#'argN'OUSp̝KO;yP˩qh%8&'8=gtz]TL<M7#[)9^* )έ}ӧۧ{z,?ۯ^5RQ|Vʺh׷7Z s#M6m.g'W_~bՉX*{F@ֺ`lS}w]f5|6 twz(ߖ:[ab`-U{y? ;_8}?*H]8<:H)nCEQ 6%wӺ\!E؋2M껧ځߓo;&91 R8v/:r,qmvv/ n DWT:CUID)F_s0/`K  4С} Network errors

Network errors

// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('errorCodes', function() { 'use strict'; /** * Generate the page content. * @param {Array.} errorCodes Error codes array consisting of a * numerical error ID and error code string. */ function listErrorCodes(errorCodes) { var errorPageUrl = 'chrome://network-error/'; var errorCodesList = document.createElement('ul'); for (var i = 0; i < errorCodes.length; i++) { var listEl = document.createElement('li'); var errorCodeLinkEl = document.createElement('a'); errorCodeLinkEl.href = errorPageUrl + errorCodes[i].errorId; errorCodeLinkEl.textContent = errorCodes[i].errorCode + ' (' + errorCodes[i].errorId + ')'; listEl.appendChild(errorCodeLinkEl); errorCodesList.appendChild(listEl); } $('pages').appendChild(errorCodesList); } function initialize() { var xhr = new XMLHttpRequest(); xhr.open('GET', 'network-error-data.json'); xhr.addEventListener('load', function(e) { if (xhr.status === 200) { try { var data = JSON.parse(xhr.responseText); listErrorCodes(data['errorCodes']); } catch (e) { $('pages').innerText = 'Could not parse the error codes data. ' + 'Try reloading the page.'; } } }); xhr.send(); } return { initialize: initialize }; }); document.addEventListener('DOMContentLoaded', errorCodes.initialize);/* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ body { margin: 10px 10px 30px; } ul { line-height: 1.7em; padding-left: 15px; } a { word-break: break-word; }}Rn0 +Xc@N۝1Х=؊΁"6SY D:[0G "N6'V7yx8%j;w !{zx x 鈮wF HG dlt) |<,'bPtF;84yzz w2e}W q9;6,f 6慀\NzSWBiOŐV|_1 s^?E P {l;'m9 J4rSf8/ɝ+gSWNYњH{cb$'ʭ8fr֚ Ճm(N RZM,`:DGQ#/Rxs!0T3]!l~S/Lt|E${H걟1rbI2CY V%'4UaAsB*)TcBa-bHMQE3Իx^AqꨁGK|.6(]Ə68ZE!AVlKެDꝑcr=rC@`?~¢v}DUFQs'0gju/X/cL %B&Jð{Yգv{@=&G)wFLj3 j)@Sw8p1ǛphDPX VHJl\Gi ZeP[ q |CqJa=5ۆin9+pN?VWKIgnp,jkh$lq+Ag}QVUb}M'Jl 4į t'dL(,W xxȭ)xP wYt/\!V%Dl4z]Z>~TElQvUFU. ;nhu|î`$^75Gũ| 6}7_ #BqMTMƆ|MlX?0ڏ-b5A.W,gIJ˗K:/9)fu e9,02b#NE^ PP;N7;n՟&rI7fxHx=[Mwi/pcKSn0 }Wv۞֦YŢcIT迗r`alӼsHUs7t޼}¼ױHA10&oQk@p-P}8EoQz.iA0AeIFZXcBj] e?rR/E5ǖq"k0N%Ɨ&Y4QM^βhmH;[yPj2`wآG˂ɍk<8vSᄍ^ *3VVzFcG&hIH[6u f5w >' N@j8%[mkZOKkXkkdz2E/G Ttc'Fյ&%L2/ g>:Hl+.J8(x ,8/㸹ha0*r}@&¼!OD<%@Pj@ %(mlYYo8~ϯv+;Nz*nEEhAKĄ&-wHʲd˱h\< ?`W"^P}$LEOcä8D(HJDI28O!gDij΃ŒW;0p:3%'4v5USәT7TLt3q@9:):>*9jYnuא"W%)55s}oe>W, [+xSL*݁7#ҨךHAJ%L#7IoX&o̳ŮM0H#RP4EILL 5F^R1^JxJI1V 3a{*$_˗/- bG27MǑtlP| ]vxH'a&kC5L-dGy,m^ 9zY)J 1meɉ\<܇ݕII ں m,$6]*׻'|OD!SgaFDbVR5,tPթÚ@X p^/&h/$SALw(zh#o kUxYo=1w18pXv-'fӟ,_.,{U{ms8`p]wLl(.X+O7\aL[tPmoet:ӣl#rPg~g--wUOyT7-9V32=?>A,ISɈu#/+R(I$ݵ/ K JBog[{HM <X s5嘶 $߿j߸ F^9BǼH|Tnj`5i Wˑ7ܨUa[.lKjQtD{M+J΍k2[^pX ?Ͳ+ .~[4a^?17-u+Fް8d?`=FAYNE4]Zl"Ks(mLGVdmp\X j=:K=z|g肵bۦ-Zaۧl zhǿ )Tv%s繚7#y[/'#"g"/ _)j< ! s4 NUpwEj5T@e}D"g@D9)4ɔW>@oi\)̾΁;9!m}-i" J^a;+!pG-hr&޹ |pXʴ*76Äkȅa,'9o[QZF}P"g;x2YQs6~ׯ؛Xar>WvIN\M"!6Ўw$Hs7G"],],?9/v"ۤ ~x]Ja -\*BFp`$*I4yK | *$H^B T0j~|&.g1eȦR & VTKZ%1 YN$QBaF\QLa]Xe'y(Y**8GəHNkRH3|zۙ , Rt20 U谷t*ġY-&շ]Pt[Y3s:A9|3U([CGq5l-QpbYIzlͲxJ~yW28k'Eޛkf)W \Wc*e"I>G~I5.BW.cE i CPw+CHCA/(l38=ZUlD1)S-@KB̾¸dĚ$W$y"b,k.bh3C;۩ VvBCwzBUc.5 O{~ʆe'MԄd!hFjAf)ن{AzAq++%@hVoZs]f-5~o (d]OZ݉˷l, RtiX.ܱGT5D,{ٙ~_AM:$Ǣ3@^ƣ ;!wno^~wLZum+p |bMo+MoYuԼ567@C3 6}F3sd эݙ޾㯊8B%˴"{ɨ1cknu*JtYc tTr:/&[BWS>0, ɵVx泭VkS[uPr6nPƼDz_uegQmr&gr_v=v;y]%^}|s-,'Ö?fK?X؄FxZӵ꤉aIp浩@q 04Q(!v"mR0#Ң K,%{=Tz{X8vwB>D˛fq [rU!KY#lkOnxicM>8x f¯@%Zz I!=z |y%Z. {Z@[۾x{Rq2\y CiB* $ |U|,7&y\;rF;]==@YJF6[T&HMOT3RV9,HI6&sڨɟQtf/]3t(hD{'!z3GK'ے /g:8,R:8#fŤ0$w7UL03Nsdqu9$8!^{]k 73^K^J:?G yWL:(⊝ɘ=ZKc.u_QHV]o6}-;KȎ.+E{(JbC*I^vb' Bsx'iEej7P+\7oR4};Yhn4^^x5Xe| Qr1܌q*qf|&3\[l|nmu(a.Kp[:[wM(x5ztkßJ a%[5-pohJ@pF6F2OC4N|:&5c)dSY_*&0V Z,!*~1ZL" E[RИHQ2)\&_ ,6)&#+8l2. Cu)<=Bi,2^+xS여{S&,VܵzqRxp.E.4rTeWD%V cdkGH>fy(͕RiyH`C3{ܗMÎ/(vmbq&0UARP398{NMƃ~opfVns^)Mc#FxFUuݠA[y8vGʰ>>"dC~GAI|\AMY Jp=HlݙDZG]A{8h`Wd ׇR͒Kuz:ӗqӪsM4Gڪ*8eU7kDsP^/EALq<.V] (Ro)׌2RI;^vS= 7:IsfBsZim;z?˖rT 0Sٶo~Tzty[N?Su:+n"NtzǴ~&(=+'\K~9>LQꞢ%ogiݡ:cBE5G% }WI}Z-xv{vPPmI*#?"$v]߻ymT_}_Ԫ;Rg7ڻ)q>Y}S@FV̪5Tq꛼RU1+iu%+'Y.U^V(S|M&0 !]I <uʗTNN.^8W۪3TVY'ur-n >-F-zVUprUM&uVzYVI6ba&uv\:t6YRڳgjWZ|@婪 {lX@=[)thUsp0[Lϲ,yuO@-R)j8J 1oFTCW;*aVabW =ԯ+JaWu9"sL(vZ_;NJjw4JqI>M \_?.!@ʯgelA;ld8*eY9T S:-慄EFS7OmRoVʉ7-brS4hI^ ?׬1w&e2V#‡#mvTq;6K-AwǗG9iyZ<1Йf4 Fo} QVtQoކi(ζĢu yewyV4!g8l߾M*JG6~l{%();ˍZ5d}xo"0 jj RV&^HX( z,TUsv_k}$ R/h}1ISVsr7Ҥ(S I̪Hj|-z([9Ϊ&wPG0e^5l* phD2/{$W,cC=F'w,l|  iA+rvuY2aM1PǣTDp9Mn>)faHh']0 vogggߝ]5X>yӰȮIZˍx 3m˘Sr U8D)CMy Խ IT2 !AE 3К;AC]%Q$`|ɐivF5EXMQi̚fB97;ďzϊF(̢ G+#D+f[#J5 JݽÏdctw{z:L2oMG#eˏ"]`G h m)҄,TiijUNIf\xIb61=Ix8=IՅ6Kī}n[g!t{֮%OX6Y7p0M_]zAnVWq3CB VM!T^h }4s9ӄo@P9hut`~=@ުR& ,z#М U7-3ˆ%Tdұ+{qՠj<=> x<;Mҽ|v  @?fv>w 7bpOR]h6*Gl' ^)t6 ;oladm+3+ LfG1Ch5,EuAMWf" ǰyIMCNY<nͣ1'pLk hǽij?k)47bM•ldy˚dfySp>1O \'/26W7nrm\Y@6\uSnE{D]e qDGd4hh4;oP}A(4HVkyZ7'MLY [si`YH'߆H6 {h'ZrmGBh1ѶЌ[JS(V/t";ʯ1oʎZe 0a"/ldh@zvů w&Z0aM0FL7%(@ 9˦ШLd^S/k8+QHшg_Pf\@L - `y h-s +&~黌 .꾦~}9M0 ڶfAC5UR2M+$@y5%|Cb7:뀏H鿴Ln'^^})0Pt8-uRHdS4|ka\{WvwNw1ekp^s>-*3.iKÖz<qd0S~Q6SفDl6zc.n"i]VFTH[}͙- d!%SVX~`+Ь(\f 4o:we / >}&I?ݩY(r{1"aP'.nN @J4 O> wc qaaxX9IDy|?q }NԁmJ`m0D\ $V}^إ@;eNͫ zĵ =֪;@,hM"|F]`H0VTA QK5# S[Z R p->4ۧn94tζ|?o-&mF2km{;8AnpJK&cx6$]#JsB/cV6P?$7Ss` @O؟L-O`%c~m\8||1mO4t-=[ÚឣOH%}ܾu}& M͖K- HsݝV9Ln$쐁):>+~{PdCL) r:χI~i1aN' brA3Pmy~sc(6gӳ훌L;C9P6'[]ک-qGDZhmÑ6Zζ$9pc`3mhK II?Mt5JmE?&yeD )<} pB2ŘQwjxcXIMIR<ԽI1Y>IC9DXeP;MǽŻʷbK-46tB b22O$?&j6嗿x$B zV%7L Ω&=4wɓQoS.AF]㔗CsZ$~Ĵq?({,=1i.9lG!2'98Ar 8 S)rVB@WSJAO߻i#[E2ӘCoM+JFtflLj׿s~;.dO8sCy@c##]`\{\&Ե9ungքeՈ5|R5F,1Ro2}%f>Èݞ9Z~dɳ?Hky8KRȌ0zp+O&WL? 7VH793C!)%e;¡ O| (x@ AӔG,Ƨ3PA00; j)}|y(ȅAENgrbx8C)&AGHdBxuCh&{8Zqgv ~lC&T 6{UHaVUZF0e2(}qf ȣ~< '#LXôdZѕ.&S䜭SX5G8|7HQ:ϡMLݱB" /@'' hP Z$r*H q%C$J|ѪhkCo}<89;=8}up_Lo54UM!b|FwJn7ӟ2;fWbDzs4K7D<~w'{-p`,C39mw9;MHdEs( kS2eΙ񑿐 1U՘ݿ^lݛpaߜ_`Qog}jwoN?߾~c";Ҁ7wxzx4<&/EnJtKNuZT9TC`0д_b=/ {ᗶGv}6^t3&Wg[v JqTsm1m&/a<2^NJp b|ݦQ@L=tEeONi Ӭi]œ[ "USY9 -90]0JK>Fzjޜ[t1Hγ\ :͘vVCZfp5* ::8, -c2rt'a8Vq@#O$ :\ũ%gII'M8ݩ8)QN I%O`d#&@mWF#vq}r6J== !b' ϯuixĊ>KGgH$i>z"wp&׌}K@m_IifW[jo :0--FaxiРu#+,;ҭӒU жԨy'.q0%9S]xR~"]eOC-{N~ۃq%>}``>&{5:նF^Ƈ]?_M(G M6t,u\eCw,! A[(7|Z*w61B'(Ed N#woys٩ax@24漯pu;[(ul2 Qxd쥤EVM:xbdc\pW1/&O 61-Ãڴ^Zf`1=pMM>V1A@ ?j)Oe۞y{̌G7ƃX0.zݝwz%@ԛ8RS<9P 1kyW& 2ix4XÚ4P$xR_8g xIcZWW 9쾽J3g Y)-4oomBh9bdd6 Xm&{HHFCJ7΋㩠=yzZ\E5`p>)ܶVI6q{& LWwz.C13j ࣟ.)w0Nu?niKv[*xt mU}{R)EciXkxS^*_G/yɏxLGM>/ՏFbjeбJL)VD((!k`oPt)M-90fb~~أ X.q$ŒeB`x%jHg'j2LnxgF7kxLWjW|9$x_cEL}J1i!F滩0l-χaGI̐۬I.!*vFUu 5Ysb=ω1>ii5;TU]d@ep`-SAC5T8`vEm _U-󖸹áQw]|틾 yl624ƠLḷZsf oEۅB݌%L ?$r'6sB jt~ s3$]?} ~-ǐtBn |jvDo<ń|?-mr)D~ 8p'㨏\v 1ih_ N]< :#RCic_e)byPjOf60t˺INao#Z{Mf،g:BaRԛ.a2 g{|.;'NQv#w,M9p=M_ۢo%URlE `ĭN H6H`Q0h*;xKug(Ssb WHwjgK]j띻l3"=t_J|'982i9+c}ۛ6<79A'AJԶVJ6^EMR=ɏ^nYh/ѡ8Dze23^zhe`Y\-:{] i޸ddptw_(fxϥee0ap#!+J ]ji3OY 6w8_Ȓ%Q_wl%ؚ|wI]l7`\/Pn$fjo$IU5'1HSBZh\ۦ C}tյeSN%Վ< Fڳ9qrXgM.7G#FC8og#ֹlN,ϣMWRUQ ß}E }DdO ;<ѭ>ѝ!]P~ Y,f#RCEP-)<οX YW[/KbqSXĶmɒn +$m&]- uAw*3l'bY{3m}tסUkV)k6CI[Q!)|XL3sq՜ FULTVIBO Q ~mDlԅhk>000Vfpj1dR^ ߺ~LhN6;%__M1"wOrv XS6^ / D(G! ߂yya3JRP^'mF4g  "&E hM51e&ys?$1Z sںbY=0ɡ2|DᵭxMLGF y.i_Ɯ/"=ysL.sܙΪ`e0:`[}G0$| XzGl8 hk_ep  v30,Y6lďba*m37:<@D .Mvdڻ1Vfj/ PS4EKa' rmh7}cͶ۪C}L^kZ4;D%Ƚx#9ⶋtS0JNǂ-4 'xBTV<,-a>NF5<3BAV_ _a\?Kddy&3X_M;櫹2`6;fJʻJdvxV4//?WD=U1Z{`i1dC=#d GJXI a4Ķzaڤؾ9KoXr;}P8#qƚ] U%BL3\vpm? O6QPU'j% f+1j?]EEOȎ'0"Ë7&U1;- .ŗlDTpܩ;H`a&,8mAJn A9_zy:0+֤Zb׹T[2k?䷱U+t8G<0/\l^L韩{Z>H?{;B|?>nc=R+lǯ'ja2G@ԮJ:Lho.r MbTjKGDg z֨+^qHY-{F!0j}K?vgcAPVlu:<ٌ:&:VD=#Rhnn7647|N, C#vZ݋[qC17mfɂIϹhu.[#J ڿ b>|^r-ʜ)86Dw=s໦M& tOѽ>þ<.܍ˆ1>~ȈN])qe>btsnף[:]SHx%  AB|Aemvv_&7&4Scƥ4oȶg%x0,7=Vx-8C~j<#NFWBTbRq@. 5Ɲ~mjn̺6[Pt8s^)4Ɗ5Q[UPZj)P3PLԒDV'h_Q}1< S&<7(2 zKsZ)IekFՒI_=$P'kFXqs;9<Ѩ):iNt{PxX+]edOCN+KQ.Ѭ]J@tO*d)urwp`7g.v9+uD_>~7X}YLkgFu]zwgxGXFgob#eY?L:$;ea]tV٥-)hZ蚞dm;fKveM#sO\g6>84F\du:$,x7QY srVDPN3;iU͙g~Σ8z:^ﮇ.lo1B2B1i 5'`MԤI"StFt*_aXZvNM~L ag-ֹ]deV7xmC⼃7hV8^N&T2.xST*Bi"݅(y^'$צ+E25eS3$E[_d廈K#lqYƶ7Ӻ;FSw[2z Y>"k:@S"WE_5f@JJeT)suX%첈|+"ѿj!"wz#: ė* s1$ծt{ɬ{>5L -<&N,qEEe^VuYc&t\`7Mˬwxt| fVN\|1q+SBY2q:Jo-{x7䝭`I[#8ULDַ| Yx`IFۓ:GERw4:r0ԕ.z f8QMjS,C_iM'\qqd{|?e7~C;~X *Ʋ;\p p)^ ^]'#aD9^{BI89H`NN_EsJ.(d/bӖ|Y^,'eX낦 X ɱŹ]8T1b~j"cp&va>+ve5~e5M&;/?q'J ROe%RsrrcUW<2눤/C}7ό\Ͳ uBH.Y_/o|5QL%pUxxp[hұ7Luܐԛښ꽨0"oOwKS_WأZo*8c OLbfPEHx6/"fwqls WY_,]!.bQ߳Bv/`~4jCU? [Xc3"0c_+,X+&f"y 1#/5DcA6Z:&$1qtyde1IZ@{zp!o:׏>Z=ά2+Co +kC,#RD:eD].+LVdzz!RD-ї:|}?)nA=GY>r{ℏdG3 m{[ .Ֆ嶞%hW܋ ӖА+Qi%.rӌ*[`!&e5޹Qpͽx%ۦs@:b)W }nn͉)VXJgsGx[vQmx}aDĢ#Tx;S~}3P$uY%R*H]śNXy/n֛tpN4F1&эAQvbHwi=閌R ,Qk{N4~{o`Q|h.=AGV?4MhL7^tXǰ}Nɲw>T!?']ƚ6LzsJBe鲟Q'z':|\]K}ׯ!\!5*B;I []\8ܿ80Ye Lѩ !L=p8}utُ[[f"诶-Cꮴ1)ZtK*,xF bR݀7 $k}k}U^=jydصX1bD膡.^`d(k_kKEM7lp!ב890mP8i3naAI6ɮ:E墨g\qrzBLq0|b 7 f7>7Mn;̑)USx;U1'3@s,"~{{d9beTAm˹!0[}tOgGfM+h kԅSby%iK^Ko)$L:%ԣ'ɨZ_7uo~ʫCZp99HiB䄁F$+:G/ޱnDr~/_[yo]i)~m_bZ Vc~Ͻ{G~r;x]ňw;Uҹkrbz~aH%|m'OJO,^+ 5ߔ˕raEXwM(3]ޫL-yXJ7xaR~t6I9oS@J5]vK*ӟێB[ I*nh^ '6|Ü\1KoWCX*~. uUjlhM*c0qRlc:z)kA?1!&㷎:f,)YbDǥKF1^_`dG 墁%=Zk};nΧXvC%`| : he F"Q% ]zR{qi ?KϷ,y{;/gQ)y6~7% r眇|=g4-k 7ـ cq{00)+Wɞ~R#;fV<8cߗ`чCڄA o>\Kve~ Ďm4O'& \#Z/4i؍ŪAR 9Ax>0tP>`9uXMURXf|!xX Ru y"rpq>, {"4Pd>Xbx&)/uAԢl6e("5͈Xlϼҝ34P?hWNF64ᛑ"hė,Ny H^bi]`U.Ovc5,|anB?[R: &"v)qfS.?->=d\5ì>` lxA1l{-M&&\ڻjnp| $F'q_W.5!c$(B) &؟:<' 8h/sq\6ilʉ`xȹ2A›Mfo1ۣE`6,R TڵTB|߃fx|:7I߯|C"Sq1` %EJ4C>S/d/8!aJ]kT؍M6EŐ MF HMHY=9{ \Tْ0^3OQqN^ 7@ L*''nH(ڈW>4%uE=\IU*j TskNPO u!|tY3z;}x[ɅEe6Ȥm8 4ϚKOP[lD14ďU>-s'Zz}Jӕ.k ;pț(uE>R6Zejua.~9)OM_b1(,B_߾4O$-Q$S_)H9P[U@i? /fC7*+f :h'x/=-? w,a^vK~M*dfV G=*.uj$D9o8Qv;_T7WT\x5et<)pg0_v?tOExS05'Kn| Xfe=0)>Ǒ껺#U)i5"ّ (8'n\eV)@JZCm9_RҀ:} mc84LA ~ "in~Ko71|"0עH jc!1nEOݎy/kPTR_¿Zچ$W99B=2@I{*ů2xo@N*ZE=c'Ȟ{{ 2t! /ɨ[2SŁWR)C,@hs"1=}H#fsgOTWeU&gm2*-3;Jߛnk8-]uqq5_ Q79RJK6,wND$=mw>c2g"yT>rk^wS]}谛9L gW|L)m 48Kk?NNo11E @R$76Fds"X]dw VĈ\3-1]'4sI5kjt{5p AM$?M$BbEy}'<>"ԧNEu¸5I2zd?A'=WIIOT%E1<2'Zi@*@GūW=5^_㬪p?c.Y]Y.BEJYn%7T x:HE2NE&iw d~Xarx+3GpF>LuM"1%b9J.CA}|VⵣL:\|=#&%t `ИF[K&蘻;4ګlwm9.!j jjTm\\U17u " ;PoCD'_ؔ9r޸Cw0+BeO=Y;yw}/ `TVSF1leX6P kr`K\,W3ٲ̯s`)_ws\4iYuZ^pzpr`pO]\F!h}ٷ &rhYMUj >,d⒚a7LK! mTMg%OeTjq!,,ho5 ӗ\w)#,nbwt,+D|$ ZWVHOmalNnP?<5ʏ5 5(Ot6B;$WWsyq#|,d$;5͍,2@cyOq{J0&N\Tgs(w-j`R^vK vA~F'5$o0`_3:[\]A{.PJ?uZc -0 ts$\-MCAoÅzw(;Eގ=1&aa f|{,^V$>m2Cgնͬ7NK*JRTz0yV̯NmG2K]4_LE}YU?ٟLZJʬʏٸm%yR_URr%b%ϋcVβqrvӓz%|H2Q:K2t^,f$YrArO{ R|ToϓNgi"lyN:&-q>^geZ^gy_ٸu/!}U2ˮ,&- irVlFP@{>%CdS^ v].22 Z1Մ^Qsh֨ Ť8&zt\.^5}+7l/32M:u2!)i2i9Yg^eN瓬$΋*yQ!{uםnw H`ޫ$ \7^vsOcuY#]y(шWG=|,5/VK%Q뀉 zC[+2;b2)@*CYM6Ҩy "T`FȉBҶž;"&N01mJDq1ZХ X(s?ե'+4Xa,j't}UQ~`HXAMoY&yz64 L)=@b6s#J, W*`A>'Ti/AqUul6?ӏ)},ѭd, ޛbT%}Pd|Ɨmj&j8+㳻v%]X~^v˼$XEPT39׼{P|:HR(MYkq?;Kؑװ]?lրl]$% QGi^r`)PˡtQèOġ%@ ,h0)8]K{(<~3";"P/ȠYYBE#ɻ%u8pg]=76YIJ}cb1֗Etq/{`>|":$#HE6nOviU=44Lє'z^f̶݄,<1$[Vv$ oȒK^uA8X|%d2p@$',ViЉD8iO5'Äz'>B u},+)a}@RE;G d I#YA 7|umN:Y֝*$(ڊ©碪q^Ғ9dfpPgWV13Q T>fcX&R`a@Cp}yū>nWg/Vequ ?sDʠ(+$JhLv;]I(M~>i O3JK}%H'U1gJv>+vEʙ:& #Ī!4pN$4)FEVSqRWEE[Hf %M&&EJkTvn]J>eA湾H^)nbVkpȼ+7%#"ٌUs-wv95 67O/B^~'mKBUN k˴޲«h:> =붡VIvy9e#bP"!(Do"vB:XQܢۭdn%6TGO )D9+~N c^< /A>/WOw򑿥li@sɿ)IȚUypՑ{GOFPXD$ixBs_P^HU/kq`VN[_1{CkdKVT ?Jr-DѕkY4=8b eSs齻S 'S/A$}thwMx,P}ƽӗau)!B9cAݴz:0:sTɥ֭4< Y]p {yšVן juY E[A /ʙEF.,G1F/=̳4Ni0@4ipS8DəaJ)~4*|@#ם3w/1.^,{εLT2V b)A(9MDrx3 b_ 9 0XƸh~, ,`NYgkfSu8 1'[w㠑f Lu),1W99ޚSϑw ̴it)1E(9#b29;ykQ@*pSqA I!ӈ 80T$KKʩ#QQCklUq6LU9rR+&-:_1RQe.w=w`#\d DynVvYltYD8L\F`*7CklhE=E8Wg:\,0E nE!E1Zb=/5H$мl+C/{ӕ!IES4z>vx`ާw&AФ!R8i\ C$!Ī%=WBЅޖ IJb`)0]jG,g: )UBVh}7flӐK4 7pn 0NԎOQNz PtSdD5ѵGܵ)E1^OIm ڼf?ZZ'^֮mVU{uI;7(gTao{KG-ؼ:^=s|ޡVo_"cztN_fd}e>_w)=dFU#b+ɸ,sRuؕ$!=nju«%.] ѳvf㦲OnrNlخs{.i  ! {ܸib; "eďغȹvC kŗ{L _dp%p)^fvV%֭"ۇ cֈgt26Ka)#TVNGj._0b7ܝ wDF#!،@4Bh85b71N%ٰ݉=ҧt@K~[ vJ[7+?PMնj9z/Zm%\O.T u:M&[;iceQT:j~dHQ|sDY൓]<[Dq-5|&?>zpbV3op.1'{~D؝7 s >gO F-_jzym6A:PAr[[2J| 566rjVTz4aޔaF2~"I}| 4kak]GKbc-*wb;<1[qȰlGmJ6BEl Z‰y膛>c;KK5_e~:Jf;D"U6-dM {)y;R(7v=R0g"ݮ4fc5d>ֺ'oM5HqVrc?)䯅dU*ȪH"3x-׋:-9jo48+ vi'X;dFtiqz?E;pP7&v0\;.Ib&qy$]#wk2#)C .?-Iڱ6!bKR=2fq[d-v>=/gl)tM1r$O9-D,-n`)XF:a͉._һf>`t-KcZ% 3TҁGXUE)렝}@7(ڊXgcE,(0PD{aܳ (fTeL_D$dFO29&=KM}{6rk,+ϩk4\d  VD(H:ZvBtڎE[7BfVݘTz >XȫMPt!?-cm$tCB7i#A>f.́]Pz]Z+'{C? + H[N 3(Jy{R mv[x;)V^oVkBri}*NG-jMh[1?, ,}` >lufN qm+J2E7EuBbh-N]3o1κyu.ib#Mff K)"%[VD@5&?k:qqg+ly55H݆J ;ie"q=LK3vGm,`̷hN>p .҃ WA7yʗ2+sWB[_*sJZnO{stxdP_ <t`'֐VS8pP6@(b y]n s(jߥ*2AkohV2\DM`yT:$8X2\wJeťyug[K7/8ĽD5꾎S 40z[i?$j#ٍОڭY刷ò " ݱM-h x̧G䐁CCn.U2?dTRIq^]u{С8gC& FӶA뺵E@⤭ Vv>!ᣍ6A Ԕz:9BVVD(%A:`1A53 y'vp;`l wq 8%#{;g>]swq[͐4=hX/LY:sͻDXugiNߗ1Mj< ;L)j3d1͝c4k\u;Ȟc$7 R7CA,eDFoX.EzF R&Dkv{oKRu)zqmDgEOMPᬇMX8DT;[YD^ ։ 9ո ͠ϋFkѵ=Lz Vu@eD6=ѲHEO-am[O t͢_ L +7/ADր*ahӴ( aYR#2|Ʈ#Y TD{Y&y;7'2g*LxtOV [u%Tm2Ofb,Y=3b <54hn^9Jfi&)(2nWN_Ds[cK%R/ +ca<~ceF̏]1}pHV kBnVJPG!)晨 p2qJ%Jxbit*W$< qrڔ3$ ̳v^&uSYCDMVYKGl~uٝ&=cӪY\wi|IM%(B#OßюdЗ_}uafYݜ2MNӯj=LO}#tqӮ˥C5+qcLnk: "akBtNw^¸Ok3SkqEԸo6Մ*(h ];51oF/d/RNh]FzwxG v]|Q>ˈ-ELS & ơO}18MO˶r]2vuy oLv?V+49ykJ-6l޶٭h8a`:vv(K7t)fpJmA--xC]"'pA3 ډ*~^=SEg*}݃z-uR&Ȣ!у@S -*RK RK[@"HUdzN}Íc\0T12@RD:02 AՄ94Ơpt Q 2$icMp7:QX2TAins,욶ߝ<%9 h,1>9^,khfDbΝiJ7!þ8GË>]E׹OxTɒ -ww/eG5w#ل؈h/j;$G%<6ر9$ Ucǁ Js` g%HDQ wJ$Y.<)Yh~P&OqXSl2ݛXLS.yF,Hn׷2I%㺫^#-t_V0mTlhbF󏾉_⯓ Ay9h]ktA6Z-E p{2KVR$:]%yd-ᦨz]ln8f3b@3ѱْQS4^S@~\s,{"[᝽4+i9 mK2/Ε-ѓS;Js` ?m赿^&`k8W*Ya.ETxTyឡQsl9p.';K"ҟqIJkmC&s'! ~GAKN;췯&V *5 i--c.{ҁo M_0VINP8iB;^zHc 4$(Wv*EH5Ŏ4 !kR("Y -}z3B$u끎زF_x@.r41h*HzJXhT!k-D*v,ZxyQjVJ<Fyۛ_4Ir4S&/c6Rske/*,'ܫF"NǬNRhxLDqv#ƭv3C"d 2rfʈKO;%M$~k5^W*,U7+;vPGvG~Fl̤Ĕ<]^pB'x­R_SSꜬbX}IB&ƛXdM4]vP{qӈG֥.zUN&Za*C O'o_9=]qqYR-Fs"dH"ݖ4hWTEN1tv=%L[.IY䌨//<;||fxĻ6!O D͓l[W4Xd\D31"ui>Hav[n%d=_ecvhɼ pOt1aHgr +7"-6CjhQm5}@I<%eu>ZL3h)SAVk6f/)@"sS1aqJpr<]h">"L Ǿi+k{;@kޑN:MiS}X7\>#u=m䚂L-GJNߣbe|1lg3K`u<"tvO!'}n${3yIkR`zB*Ċ|B? ]kB´oGyi,,LE͞_Rf\fb$_U ۛ25,}y/ߐ @N2M4&.3!IkZ5eqVgMy uEaz0jAD5el_Pt)KbB)աNwcƇ؇G/uKVĈ6ޯg0g!`Ҙ^ć]j*tp|Y"lVgŢ50G Q 1\`HF(0d/ki>KrШ\y%5*yrwz㸽%M츘N]Wv#|ӤMmkp#ݵMN]cӏ^(U[o E8"-<"wח(# k\X,@+^ /PAvB4 Zs'}AY.VxCF+⁧өx1Oju`'9ed^Hωx鴒D X e +& t6ogeXwFL|Kee|+u $n )JJt?(:ʋDd'u eŨFjKsO;Bmc>Hn@(WyD`n>&c58l3c`j^F#Bkc|G9Hk)#F68 nv_n'Mxl,=BO0+\_ k֧DZ(?Zg2%Df}/3b>)n4WvX}\ڈذ\Rӛ[M: ph%*dkǢi:>}}jz㍾CQ~CvܳGE .F=ёr:CjsukހcQ3yC)w4ipfma nKs>Ԓٹ5g Y|(Y?:1(oorԶnTFޝ޽޸[k{1߶`-ς%T O~ ~HN%E10 ⒖3>mߢf%<[4MBVp~ϤG[|+pPs@6j,򍁕*67Ydĝ<%5:$8Yta+7.m}t3V8CZ $K@=0I! $5K0|孝qe@]WnnX,Y!ǀ2Mo,E'3eֱYiDDkwNϱ d`d ;y|ơ" b1-ްcdј:yq|-!0C58~1v&u&fGҶ}{F}`pFqXkN/OKle4{)]/cםMr2w<נ{Ry UzL h|*n 6v>~@˩w2Ho8ȖņتCc-=MIJ|U:wf ZQO |!|Al6uD+>TQćwPb?S Y=!j@5>t=gǬfxaT sT9Bu. =xqx|p*0V(~O3b[0`lO.嶧snW|qEaJo[L[eJ)JbߪtQM3/9M儾ht4?k%Mh9fKj_6浜ˢXbjZIeș/ B&;`ԢynH5F|"[j~8Z8#U-ƚݐ{-VaBc{[;a"6wpKm͟l `p _ELMh R[ZWylⶶU%߶  U1k1"W~'Hv.1Ѽ.ai _7n+G98 |- <=~c ]@+证 45h3ev;&e^C wcKnvZTϜ ]\[32},c/BhlfuUٓ@ V.f)ً(ֽҸHckt<5t1T*yQtZAF6t:f;&;1[}״l,mOЌtxtnmoٹ%-PRjSV6~}74w˝dƆˢ^PVFN n?cUF!9߂&Eg ' Q$?>ߥEl|{<[Y Ň6r;ʭ(U좕FF4LބyYivIWm~ZxCnj:s 5>w٢ &:Xr8tS{%iTpb+0Hf̊LMZUNdS5a,_.U31ܯ[t OSt=V鯺3{3% ,Q6G#jOxBS_>grّ4R5oSp\E?@9b"?}nJC}3vq%`vdp׏5ف#bz!̂!5kY.i- @Q Q<~-f4ar.EysNCtgr3 4m%Y1cY/f𛆀RO=}yPy =UTB4E(I1m"d,*4ܓ |%3[#\4UBg*͜ETέ{ceS^kBʰ.MBmro>uSqvL:Lx~wQnM(3d@~;?i:`V%sB4!7%XB4/aNVh6w6ĕ;q 8>MxjmB˵F; F/]8eC&bBj+Ⱥۍuᒺ6OoH?e9-yռqW=%s,M 2ΔOdx5Kh#>49"k@"v`M ,Z~곪;w4ThZuR1 ̦Gosz7yTl2-2[8ٗC8{ KeـVUU2.2$ҬV BtϵdAV$0 `2i[lqqu&5S=ߎ)]߮rtJ՟r_D4˗陯Qx(bQkDcfp28. r35Sre^w6Z5'?u$֝Rk䆶@_~|wkf Kg3ם)2F#KLs0c8A垘]H82 rziUěN?CpgŔd3P)2h%Jžt$Ӑ%"O>O:#PhvUYP}cF%{+Е@J-Ne1N:`2׊ZXd tRb}"/<,wQ9,d2VINƅZO=[_Liõ h[1Wғw7Wu2Jcs^Q 7rsbljO#|A6͎{^S#-L8ma\ѵ[uc~kLd;_%>ƀ>)Ko1BSND3K=j1e-6=hD熛~A2lQt VpS=?'D|=t .%h|ZZ=o%*B̎m'4MNsq{Q{,X7,8 N 4?T,,"?7"֘/͜ׯl֦Ԭ9ӧĜhMEۉhМ<WoYR1BsԣKW=ck&f&dM}U5j pQ`lμ`ʤc"[<ƎAkfIT_\c-˟ 8'('4k< XCO wlFaʖ"F:!li;}c8Y!RЯB*nkF25m9F[|!ݒ!(eG`{"Ѝb1+mO03C:ֿqs6Z+5z-ˋ-2?ÕK2 a. HzXM>gn.ib>#VHKF X" x$eyzc$ =΂+_< :isYL`C_>D<~IS;{i|Ix^WL<,[dl1=S\ Lʼ OxXLdAL$tiĐ,H{XhvExuB I5M'eu;&ՏioK1$$/ݲEq9+s֒W?>(F %4r\wI/韴i&Q#P_!Kj?z`He:Jww/iӃS_ OH鯯>σgo\J˃__:xuxߧuA}}DgoN;~pk?>8H1_?a?|M x+8P=/{_#Bd&<ݽfYIݝGAn<1ƒ;tn43dwVf}xQnibʃgFi585>5NsNg 02hBA5qX:-Tw k62i0R $|PlBҺ}CAO/S.h?Jp`[gXx74ى̣&0O (OCL[*J$w79kcYȽrn.w̾%j4^ݷO dQ􈇟twv?\ޖߞ7:xԔGӼg&,3Z4QX0aujH e,&WekHX /!o8"td5k|fE@dP:M\R\D0$wf [q˔ >{rR]gXwE(4k pcοpDơN@}TAടil_Dl$;P2j7Ǭ4=L(b.|Cw {3 z]xVП^5E"4ɭ`ytPwX~Z=ZP"7Zz;G$2lM|2SFnbyNJ.]gE )d!Q_,QZ챠H=/0KLoq pnl޴q5 s?cCIJ&J틋:je@0%ta ,*mˀnuћ .I ^.JAZJµ s7gWQb =Ԭ32I *˄Ս2p[n>1 F~r|cKtެ|(Þ{ɇ욳ڛ]䳧|2APv6E tX ~Q]>a]V7xH& LE-霯QAg ׵ :]nrsm%VNpoݡHSRM/ܑk >&uW'}') ]B~_<bޓ3b<!_z8RVQѤ5 Jn!V#kD扢E͓GUĝosJxc, N^ :H(X ׋J|֗QO:.;0Bx4/+Bm|ہT)Anx,Nxe#, YIs5*U"V{|s/;=|Iƕxz0dGGllEƵ~U*]5R+`Yn8$\ Nޫ߱h9fKg=x8dj}M5&Z\;"y9%ʶFMTlM;Ћb9& *F$ 삊-vd U|2hZI O#yQen0Skvs0ԅݰmC$R?2 /ҎWVܳ³&֖2=PuYg ͚k@d]$v_9{yl3ΟmN=+~mJr0Z9{3f{" c44pRԈ7nt>tn',drr7?$dmsu})X!^_xo9Cu=I&L&;91Sj`;WZtY#aXS̾Ks|ZjSG4s槯+I&xC sD>M|)U8R~;O)MJLx7'+YPH$ix^L&}8I&m2]L|NHQb<$z4-?0ɠ8y|Ynz|d&;'?YWf9E)LTԣX@h>/f 0tqޜ| ؋'rU泼~=թvK Js7Ye'4!z_gx#T IŁ ++X7tVW3Fv=H!ghZS Lc5*y-I6Mv^'`В:z^ψ)xz/h\ToeA$mDg=D&$pT^fh7f II}+_~\ qi52("V;AT!W+XpJFD#9ʽ$iݐ/4-d\@z>MI#!7L J lwmu`< ȴ.5 yeqΫ\P=:Hm2G=2ϾڝGnyt{G<:>9#gPTc!46`|L'_ji N8!tͶ21Ғ*׀o:rvJbo9̤w\riOCڔ8v;JoH| m~u[Vja{ni}lނ嘸_r决 ^og1md5oL<"+Ŵ]Iƛa@ӻjbi(/oVa0M&Jf˴[9e&Dc+ 廬4QKa%Ucq2m7]q򭮖Auw>6q%>~K ڋKN__ǀE;% kE;ʦ'+5nzlukrͼ+\w~˛hؕk&׮mrX3Jԫ>z>6mE_v5ic_nԼ,KеFƀr7n}WMR'r;s?5j t`vw&m+u75ֱr H_/k xGRDb*Qm+#v#- D x;`U x;ne|a^VfxF/ڇxAI5x\pTAXUb ,9ƀfla:൜AYNGz;Nt+3^/6|rje5cI>6Ob 6;1j!k̿鋓)k1+N] _i3Ilh Dߤ3? tQ =l%20No?de%>el3aýhԑ)u k!KӼ%gFuBSc鮗 deqEb" lՊ<ځϰot-ܙ텔{l`n1cy{A#gAGFpg%e> ^ `*9ɇC`>mo>I@J@ b`(Jmqص)e]M \jXn?FmhxhGfHI~Uf#+nt /71oԍz"iiN m9w5=nX&QRGې {zM -b#SniGq0 o,|1bK܉p{r]ǧK=0:_K!a8b-&tkzA_츐Vڈu_&#hIāz-(^-oͩ8`[ /ˇsWJ3+XTܖAZx Q ĔcOw>=߳t\#^\nLj&lAa<(ϲX*+Uѥ{VY`Zⴄ͔Ho[jH$gdkaBܥD`B̏ɍA[KZ+]$.%lI2ړ!_l>+PB)lkK۷0' FE[hZDl[ƛɠ3.ןJBrI1q섷~WS"|3тVFzɩ6❫BHz_uM$@Պm(n7EpG[3h4z#z}~?cY9;kc\l>=ƵzQ+$>suuάyK3q ZW>WbRn) ʺR&K8Gr$vpp=%_S2n . 7zu.X/9:-A#}K sgwBAkLmu!Y[jg\͎f\|[lwoMaX׭j,[J6-oKڷϺ3b ڶ.z6˗ِ@KnM:/9k- fn#xe7ױU76{K~E qK/y7}kRt۵Uww;^>o͗͊|E !3U:k}D4d&vUDwRFỗmA~R Ҿ^FGNx"P+_O w~P=CUt*$y|rVc{^y{^y^s{,֚ڸ-"A/gը5k|y&(Ӹ3ژJ>qv_Sk71aᚚ9ײGV1&ɬkE(f1ZŨ~V2[_ehD<ՎI@k-?V,b%ζ/a7Avwa[`M=SۄXXǾo#!͂ϵ}'s5ob+aƕFF%[b1^1hT߯-ɣo͛yr|~lgbh}Zc?w<Χ۷u$Iow[+AKX ﵏V΋s-.]#ے΍.ҭ~sщG )pqًfd 
$i18nRaw{listingParsingErrorBoxText}

$i18n{header}

$i18n{headerName} $i18n{headerSize} $i18n{headerDateModified}
k6&6Z"m/((yKD !)")kϙIׂ.IJw;)ǏW~ǧ5g.9y^E }(ɆBͩ$NdS)׬N+VJ0JDIe*\>Xirdi8KqN3F I﷕h,N*ɇ"GO't#*.;Z%*ZȠ؃K`x[EDjFtC}#v" +QAQMSDoEsVX#2[E=Б<IiKu~o7$SXn6%eeia{snlT0(i+BoKLu$铌 gbX;ݴy6\<2Z"`kSYLR(XghD)4RcL5]a dNJ b/"p .\7P0ǥ9S%]OHvVx o`#gE䟯!|Eg~) 7H,3H_ eą=/̧< v3 hw5 kd]ks3C7i׳$zggG礬Bos lakh"ϭG'jX;ɱr޹K9@q,Vhd+Q/ }vw,ǿd8=@K$}c = QS58{@xyPΧ%{9 zs,x=G "ʘ(sVKn/ҁ]i 10i,'o,g L&aКD;iFC/en n`ک/kL߽,m*6d@ᬰ]D-<)ϡANRDa3x\^/ԑ 3I8jSVTt$ڜ$ӦQydtCt D"lVU)¤6 r"7xlW?@<  %Vw `߿s`'I#%(~A˒-R[W`.g0 PeSYJu=Gxsp;Qb0c}`}̧WTkEMz+TJy(=dS&@Z1b#]`BIYH a5bM;L?w?Uည׆[Td<ww4-(k#0 @k,p\EFca qzbF\ Jm.ZxRґz_mDԋggfBa0]6K)I{qk5clS Q 2BiD:a6* > Cڧ!"V5Puag&U4VThQ-8(eo NWa5b+#h+4Ps*mˊH!>@161,~JwF70Lhݠ?śѻ\ja碋:Gֺ3.~6jƢ{{ Gd*`f# h1R%k|dbZcD:hs`MYDv9Ĝ[oBj=v5F\n{1$D |-MQǴZ 1Q] TVׯnHjV/Ko !Tf_tG{p_~j ~ԢiuCS7IΤ_I+zٯA.TM :9 >(S]M9m$\:)ɓ]_oj?\c}(vM7gW΄ i5UUNCL}ûC %~f}0,A{M_vad;GQۑhVM: }˽4 v0|q@]'2l٠5VJScAG&{UY D)NŸ:u~-FU?̆E $Dz C'<>pFf 9Eв:N@u{OiכkxpeE muIň{BP=QFtkbL(Id{XQNvDCYR]l#cQt6j[vuU03iߓ/1!6uƈZ+,G̈́.UieURj^[.ꉀ?N5h_@gA zxqk;?vV}nK4yr%؆^BpTq{h͊Dj<'1?{v[5mtmmsladt,w6<51*@gT hSN^)YNc_4@cܝ<\>Rz|3 CEQv zO}pܳݎdf59ahIj0ɷIpB;~EmzVycBNg!ˬ(G. +=|McykgäKtO}/5JR" PB{FGf^J?u>p%ͧ)] y,?#2sC['G1* c֡LzGR;/Պ6g`f1P\s\S@(HP(qDUN?گ?Q :qJ~&]{@o0**^_ɷ ;M(BS$gs6](pBPavzvEwzGj jB!8ZwՇ1!v,F@'d E"zeD˟)M{QOlL'Pz"%.o nrJ 6`Oh`c0eHl("٤,'K3洮٩*Dx2ܾ9"1D)y.XN*öh i?Xх<ṳc`"=KDH7= j}le8y{}XeE^2s7Pf,ITao"7_1O$b $mN:4$ Щ ;Z[ېUl G\[$֞y3͜Pe-9_+&W0{Z;3t;R%VHjc-퓣dD@2UmԸ:vqNCaRx ?<^?5">?RZUHh-J-Rrl7C HɅ&- gaGYRhey+k$= Ppɳ-<܌h pÚ-J.P.Y;& 0E=!.^#7lln$c!|1ҮI  ߫Bpa*TV>KP|8?(1Llރ/ ny[(YVJuY}.`8Clt=R~B)lp0L'4~-)-QsҀΌ Y a4|:!AK쿛2zˆwb{vҼpp29il%$M74s&B?)ia 5qRi'vItW ݠ`ʕeRؕQKPr?P$?m'{GNjWL,oG Iq1z\Ub_)!Ӱ <hۇGPs}R( !|aA.dKz GN~P.7JL{a=_el1ؿI om<$rzֿDGX`IBm\`WȄe5PEVGolXy v]?G!͈K~T}S4h2.%⒵iQW2 pAտċzE.Z6}mN]pW{.Vms8ίMC&@^:p٦|hb[Y[&@ ]8쳯qNj`^ER<Ȋ7[v,AВG@a4al@%C"zgr"V0"+ X29._ % ( PP1)i,8iʗ,A)R(JK;J5'((%# rUdQ?9,JRS0ڽ]Nh4N ˨P1>453Y 5REFsII;|p<L<#i Nvc] !;;pף>\݃= qXN^߾! ~{= 0?v4tQۋ\'Ԋqn G [7B7@5[' _ѽzF2wlAC;P(q0C?}7 mcEF^HBr}ڠwӋfð!͡鹸"[vpo l5F9<}kߠG?*R\CWzH;"09aC{-t0I*2_[9߽h[ Mb"a s3to(_ݹp+w=F@n53tbUkye֩ǭpqS%|hLx 3[nhH2YX,Y"t?.Ƅ ,Hr$ջR~cY$5S+!9'd,]Y8>smVgHV9Ԏ$IG*p$)! )ir[ja89!C"xa@/ 1IiQM(u,/ K.ZqYQkI'L*+Uqoܺ|YNNQ+<1craMgm֟NfŌ#xShO?=fހX4E-9|5J"AxW,OfHT>zNk7wr-\WVN34k=o];s6{ e̝T~XքnqH%^3)#IYVJJis&uiV+PÖz{_TҘcHS8V1[}v*؂njNiVdkKouͩGdYޅ:HԀ/Sy~#U @6 l *rX8O&>#Uo:ph|imlK~okߍ3 =fsA}-kfn*שasRZ}_̳lo©5,}S*[Ү&/ O_UMo6W fa'P=mP$WEDD$Ҡ8FZI|h ؊f{oF Zo| ۗ`j̺uyA]`e+α*3YY2k%( l)ael`sҘJT)cJJ(d[kUn#~IĩkSz ѕ0Ke9Iw"Ef99Xc<4~59a,H $O@ H҂@b~ ,ҁoc%bY81yq[NxPIP +x l H_0Αv͒Y/Nz4˅1C8fΫx‚d=_h"Y}a(*n=l~_`! )j;8p+⎖q^bQ0imYvC_B޸E<((Q8"B,BVG4!͇aivK䇟nf gdw- ;rt/,Ӱ%=년Mc>eI(!%3)vА:tO 9qrޯ/cqqrr6xC5=Z<S;k|#'Oqޥ(t6v9'>=b_wyH^:ZM;GN.V +t)GB.ܥrjUOW8m-^JJ᪖ r\4=!|^ԝ aJD|eAGVk[+㿿;. ]J1 ).tEaAߣF'&%:nב2'99QDw2:jPD@&) Q"D ,u00}"Q`iL6"<:[ fdZQ1-Qk3U?$RPM-iOL <JuAm$w7ۻ Xw(Qlmq 2BN}pyZE.KCfA߫wkUn6+KpEEEDd%Fу,1 4(*YwV6.=ԇg޼f48g95,{4\:=xkKLL[oC0Bm[z Bdklp‹ |vC kͽij˜B5ߙt {MX܋8J))"p3RϷ{pj }@QFƄ]o3]~u4zצ㴲m6;/L Jնʅ_\iTٺfiצ]a?xA{SwaxINlN .E8жŧF\ptǰE8p}x' nh0y({Pz T1/,nESmCR7R,%,,RS|R̪`>07XKj j "O*b yQH&VȲgB1e3rKESy! R$U$+.җ dLxz.[,%.4ʅGlq*զB$YoMDٔԚ' GQLn#W[ƳvT;Z*EYEF"3dUG2)+Y,(hFyV)-yɥ֥(s:Lf"'41%썮1C{Iy%(M/|N ϱyBQq"lSӐ[l8OcwÁ8JKZ\M&W(=kǍ0n |OEk5$JaX2c/םn  cqغ vu_ -b`\:{ι'\yOp]Zv1ֻ=n\m,w x[7O h\ "ȼn?!{G k4t^+;˒4uRmk0_q4_%ukm`[ `PAζ,I }']0F{y{n6iVVejemM#n:_p -icL lP@lj9PJ)C5*&?/{(g$~BmgQƞ|yVVwsA/N8ɍhJ4QbS`9fg{"l͘Ԟs6= Nj?kGYvo-sԬ0tJV26xFLJMOA@)xX*j aMz'o4TOH/TGqi0-IA4hg|gjXMpVZWp]il=S)ublF0RPosp\{9d 0t}ԮRIJ g2 3kB !1s0]yw ?qptDqe+7Ai]!.~M~LNCU@;'u%YBl)\"BCQвIE1b9vc!E4J9Z1΅^p}Sv#._!66ҝLt ]pB4K7:Y ʍU=w oh;*cI"dt Bu]@S J:ݤ=*mpY@c<*D8(NXP.H*ڰ9./=Տ~p懩JuI>YWݍr$17GkOyr 3s=rlxn)hq+c5-]ħ *@$=VA+&EH7kQʶF̱Ey4Eo0Ɋ|EZH\s|&QC?b TenUIw9֌iqVnZ G-$0b;NytgU^#u~@@ d0c?d@y>bڀz2/p ?X@> =:!#u>D#- Ƹ0t Z l ݷN6"1$FrR>ȢP9UZZ5b0FCނ͈trSaʙ ys,SR ;IuX=էE<9^~3Q,TG$ (}Z ~:*/PS]tMޖsӘ%U!S?J>xzH5]R.!_#Po_5]ZtQB*"ހ5ќ.|с=a'I`xJ/kmnQYèL,^ű G>fvmPօ0ᷚFW@D@-TBq<EokIeh`Oy.A.q,T"}2O3KˮO0CS'u"y? 7E8UX'8[ZUٮڱlN88"-.Ox]v"c]ԃAS5vzm%h>-ܧǕ#ߙH;jj4m?7ak*R8zDs)MXd`ÏIX3aJq5M%Mlh{VM2]hՆ4bcWB_gH'M+յn[8"mcDFw0ӾmiXT^JpTM8(eG,洚9Ā,GwbkBڦ?UY W* |^}EϿܹ1d})`t>t6DoѺ1wIO+l߇<۸ӯ;FBٻnm c81=q#~{lGhY:PB2~fm/ZCDYQ#eBgGgpѶfaG0¸N=t?ŒmW\޸Ņ*;fR a^Gûb$k W*ci{,pR6 5p`wl9bn{έ`Zj,mT-$|$bYJ0)#&Y8#U^6#@ jE %_r;U=Jy,7MJ9㪢tZPL(7e&`ՈU-˼cyݳJ\de\©Z.L2ͦ%tImz_h",G$W,F_ftalQE-T*`^E]2qs&AYd\#Y"Sd*K6' yJÚ!d"y]W;&?R5F^0|.ZFvHt/W0%녊K>gUhCM@k.KSrL$T45Ggc?H~nd_8Obrs3Aq;kOx#4CVb4hpB-K0ْ&G뿇_ptsvyȝ76ic~[ļ1$ؽN pfff֛{Ф*SBßx%.ic |s-my Χgɉ@O]p]— |7~opWmoF_1Pq8$'iRGSͫ,HʎQ\IP\ri(R8-z*yf晗_Kʶ mif+YMFV4^_ l-N7u @JQT#",ɉ7jEB5֨UkHT%UQ[KJUZ]^-iuke V` TKS";Up$[aO,^UuU(VjvN3ާ\lp*V0^*$TC%Ѭ S`4/IFzGg¹< :owO87HeHK? /2J)ϳ? ϋ$n_,f!b iϧe" Ӕ™,>Eagi4l-$OeLq3`GWmapQzf_/v(A<ϒIJg! oAOh3EDx zL`Kᜦ(_9?.$Ix΃tyfQ"4L L,Nu4`$CT@u2'Eo@<=uls3'.ۀf>\>< q05H^=Ic4/fE8B&J/JY /]|RK/EO# HC9#ߕɦhz2Htmohn{4ڝF;cB1IEE+SSVTU7'z[PwW3 C~-:^6<@tR0Ù n3tƒ'Osd֘,<0=nv:Cq n|Le=>}ݕΟ[u;FQ z?0v>\^ &>`JQǥr9:qfhS6']p(Au˲ 9봺БCgN^ #vBka|@"@,P9 f ՉGnjK+=Eu 1zbM>u87F_~Mࣇ+g~:Mܯn䡠Ox0ri钎$!'̟A\jΪOx, V]s6}>&Cfۇnc  8nʠؚDҾ53I~{{b8F ͎s msr`n1y>(ixÇo[ U6(.7pSdsh%6V ٪[FTLAq`/eMRAdp)5W1J>܀18) 2Y5&+6W S&slhXMVfc$Jjq=D3i^c¢YDɕ> ``y,p˔ˬ-yi&Ls%X<o7$~ @ަk7&Q( x2Z$v>vt|`& 5I@]F>xLAJIbՌs0.ini b #!%SVi`b="7NdVq&L?3xKd6ܑ d6iLl'0%ם-cxx~6;Dģpd`[n|r0mB~Y]scCo$ia< gw# ab[%"t]a=}J%|RH"u1zf3RԆbïe5t$ȞtÒHfj}:'GChiBqhbڽpe{GYvwvG ODBdf&+yS3ೝdRm'W?01;9 h4(dU̐;؁;:[h ֜$'Lk3E}<*Pknٵi1Ď0ؘa&Q) Qב][lS}k6͟%+Ķ +;]sءX(D:!O55FPP^(fV퍢g;QxkccKV6܈ؔRVx'6fA?5WU] ==}[ݲUZ(ҳ+YUTz'wBƕgYA߈N˲WmlL dްHiu34 i4{Pj#JvCӰ{n_ &~dٻ{Ǝb,n / UMs0+N!cHhSf:iUdG_w% bHƻ]2CY"?Ȓ%3ru hi)dPJG6ѻVU2=5]egD#lL7*qI*g+&=2RI_wvFC;kgm4<%2On'w7#FtUKo6W nd/%& K.I%Q脀$$-;C+wsn1p|uyO>oo3_oA]<Sl! M0t3# ;m #Etݫpۈ ; n, Bohmni:ܹj^ii@otnM;l6YnSFpQ%&}v{h s`ؾ]އuCmރOF63Mh}lC>jߒ0A'TP fpPE;ԉ8pLx ‹RyQKu穰S0y! T}㵬D opC^7R,uYpUVZykSxSZcZr VR HViU˦"ĀRиSYx[Xq/+RMB:EJk&țIX7r]+*/Xb4%+KL-d/9Jen!$uFE5}!$ -3Pk d6 `+ RH"jJ h.(wBQ\މP*(!fQ09\Q2DٚK٬/1%tdp)t/9K7Ʀ`Ȋy3PE)9t/O:=C&٧bAmY=gzA+ i?քS t4...0vk0.xXU +h{kv[/~vαaH9lB՚Ëg|]|4̢3m [A7w$AqˉA,6:k <^{3avo:7Ms8ga)T6]{2^"l2!=X % &S{gT*pV~uK&rz }~?~'Xxt )<@ N12m{5 pF\e]&,Ѻ޿R\+~GK"<ؾ]KT:-\1l#N!1@8ɏ3 8Y0  \꯳5 J7KA˹0k%D m1!, 4(1T`1RU[࿯Zb\g Q-2@ !RFf?3AaUĿl&Ja\ͥ" k)Xj-5WLx1EX %+oT\[0ȔJNB(D$Yf<F_8bjV9 BVl;ؤV|E]ϴ6RvՃȹɸZD` \j-2\zmt2.ײ"Rm H`丯#;4cXLBX*t@Fh~T'I;5 vͿ,uX xAq|}rtdr_tm/6|Ɨi<3z2x%ݹ|XXiBɇN\ٵ~/&&0DY1Qq~ I%mAEg7sf($ȥ=7&b9_p3xio2 | }ED@ޑcD8ZܤESFTÃ~ONݴΧ\ l)SLG'h6X,U=WHֿWT3g@ #{ hB! г{o=c|?|PHwݺuo=ɫRi4ҷGRV;9ifV`֠E:BBs,EmdHv8&O{pL=M)[dj; ޳=TǛ;)آX+<v$!V@9 BP#4@Nigl"녶iJ̓j ˼,R[wES$ݹo7#WMR9'^4noz]%zs~EN%Һn_ozfrӸ;oݼ+@nn{uXb4ږGn/uӸUH9^z7IwWiuڷ]"n޺n?$Mt/WW\97YdA+ڝ:FՈ?5L UtF ?4DXD@x@Hwɯ@ӼFQAY9pٹo5R3uEѫS@lԭ系nZukv:w^@.o?9@:b'ooP]#RE;Pɧ&<%h.Xѓ!'InZ7 j[$mZ]h1jrDŽi'߷Pr mqfk\rJ['ovÉ/ \:ۭ7XؚvIFN ES1&ɱ0K:&E-~84&<&זxErihA(x@C׀`91W3!lOyFs s"#1!GJM#р}{aM5 A{2H i{3wP2=?J{iFdK3¯ Qs4š!ăm@աcq =\HB5%v+Ӆz`R< jx=rKvhM9y` 0EC ,i?5p(ni`gNLaZhoLyXǞvIvoU ~AtXLbd [ceQI4N2̦! 7np#z}}RȇѪ\(ѵQWiQ9XUfRUSd9bOJsdɂdgx˞?-:2a"( Q߰_! T3"=!yLfqLLQo֛}vۙW>yu{7nލc|hakMSi`|_i^}ޭGgV]u6?g~|mߞ938\7*܋??޿y_Yvow^w~rz;_CL[LmA:-hz=nV8H` ֔g-ҍXk aʟGyws6_ϭ3?bїޥ{ẇQ~<|9Nqqpovۇ_ܡ|}..şCqc~_uv*xس\Wsy8;2YޛdP4Y{tFw۰Y;jspڞWkusi_{Ok1wO9Qy~k;Kh~y>^9}?F<(S1I~[=BGa?XU)CZ|Ij`-0b1hv^5e KdسmK-A@eJ_ wRrC+bP22BVYgÙY:Uy#Hɂ/fTX\lO&;WdᆬCsB{*"$6RI4>LuɲA3̼◽J-;uʼnMQGqJA3Ƚs΍N8,J|^6 TLJef=a3E:sL]:\Cv,tC.^2dž!8!Q4_J|ޛlve_[1mC/;afIl.oƫ\HFϙbSt 0n v?aɪũEpe( e%f*3)E\V`.Ae 9/a~[S HMh3'*,7aQpʯelpCm=SB%$*1 GFc: ^i|5)FHOT{"9<+zFª1JM2"THU-Gv×+NS݂Aw=h 29%9^B! xJ/ +ʊxϢU!m gI7mZ̶s^^:k–poQTہ݇-}_f҉9Ԓg$A" FVdlsamp +;0 9cYh9pZ$cNd R~4+?&K2SbDx|QiͩE갸uJ'MƈK^*%>~ 89% Gu!jIGts\`@#w&ܖH:0j1P3S = j$Zڕ. HFw`QHbx}=!L۩'-Khn!s>_c9I/n5\i}=?=uq˖yQC*Ax,حf'K*l" Xz;F(onhM_JMwme(oN=8|0CsLHZ,Gwr)!yR'Wc˺50(tOvTJ@Z$*N;fE=|P`=]dVuJ$JK T%rU֖ɒn1&Xd1~yfF(\ZyXKC6-ii(DKFkI0H **dilHu#[03AjdT\הŴ޺ӟFh$eALiPNvR nbRԮlJxrk-nRWi2TsJJGÑsSy%!CJS+V%wN36؆}Q  70| svFvY \޿XBPxr0麫MND @78|#o%%{pGB qC▗IR8?@`}{҄x VVkCB&Mɱѱޥ4`^"~.<'bxpThkp.ܴ/12\ɞ&}%V 5| e熞7;:6MXh>n AEAG^֎2W?.+(aSe19 ;9e׍ gϹ"gEՁ$c|142JM( r2 \U}H@ElbTÄ5\(QZh*~ZRQБ3(잏o?EjSe#Dٽ1P2ElW(ʃXȽ[e掫{\\' yԔ"K[S/SJݼ\Q Qꯪ4jJDZ`<4 1{ +b7EE@; ƌA9^S)@12st'qBcokLk1LU8AAjc-FRޟr(s%YeB UZ *xˊcF%ɛ]_$L )]dE2^6It,ɴXIY L3q_I3;`^u!rR3z"rjbS֡K D^-&ZUڗ ]gzc$0rҷNeUKvMDIX"XU5TQoY"VʶrIb}%?>Si*$z*c@5 #Ӏ[ s1mpE@q2}au5[9XJֺ3w+|Nj ‡ /s2\}BlĬ|X#OSz .էXٛXaJd~TE{jќ byOTYGOP?mS>T( 61hE.zH/P<-]^("nD|oag 37L+m.,DbSP5m'D@!gEMDRٲ"z!_2.TG/Z9)\4R &}H*_53 0qQ ?è(3i5H`<c K1?t`Gip8x]Oz֜` 2s,WI<4ٽl?7.Iܱj jUHwy|RL`]LJG[_mo5m⣎ŗ1nz.ՍB "mug%{[&4{1@L +kGL֜Fe VOp5±:[i<C9pbq:F+a*;NqU_/q69Ϊ-̔͘%4+W: O^{zzLꪧDU W3NӢ\.,oӯKUTQf FUߋR16;yo߰vOknÚ R6_Uǘy-z>E('F0U#4˵^= ʝ2|A%Fy9<s(S,'2p7 {Z.gˇң0-nM5ȯUTyk8=ķbwZ.PΙ(4[w*5З^A#[ <}$TsFeOEqO@`-q~Ş@ȱO$29W`*? b0O8a)>a4Vһa1y[J:e]TQvF}Y+O¥ũ©^Zeg#y~oOi`)'Wxmق|o1 t/EvMXہrLъ'>:X  (/e?C6,<.(Lh_sk k;oI)NK'}δM7KKwQe@=e)`WRf}0m(<4YR} CToy/FiEM#.OH@</=\U!j9lÇߔJ y(N,si[t۸I\HHDBT:"sI"a'$3A8 [Fr{_ּڗ,dx @| <ͱ̂0 2__ʜ5'F70Le"'}3.q1V6᜴;q3ZuuNqSo0~_qBJci2x͉5ǶliA9'֎I~$;cNMY>= ML+SV E:S B#=xӹ 2Y(O[dBT\Cie:-@jGrsVRa̓M&B@'@OiXiB0m3!JR>ūcROv3:Zj qRzY% w Vm!&C2;ĤDa6pHh2:omDsAi[KHxVyP_u j#m!}#AXTHYv}_NV TX}:獣`C]Bwu,Sj%5R̎DSz)Bذ4ŵa-! aAy$ q%kr8RwX3iSoN-1 CE҄`,>Rly&q"y=;7\$S2`/疇"Cws3ɖHFw=$>z!]R 0 C`+" #f& ad: o> {r;7!sIst034У$ QAo7׿ʼn}!0] KKI ڶ،k(a&d\8+6T bT&qh=7]hIU YS']3b3IbYOr3Ji?A@5Sӥ  [G@yfH\De|:kIJه,, BSĤ} w27HH#`/XM'Zإ퍉ak*sDˋT;{fywz^p<7lzak\M15 8`l%ԪPغeW }=lfBlp5 .-mt&$ +s㲴6xSkcKlSQhNTJGӥ13iڗ4eVWZL9.um%.|bJ؋S@z\]Gs3l`MW]N]h'_,U߅꽁[Fq` 6F4X-L&T9Ԗ,Ύd+ os:#/1N5ئoTƺE9+r2BD`7&g zB6tI! =7.-(y9E}Fe]};E.{XtLa̘k|yD}s-(ݝ:' Ӡ+"Yц UhBְgRcN=SdYbI,MҮ_'U/5|'RRܳ&m %V{CE~9,7FG@Bw[5lyh/(s0rpEu9wإiL8 1\i5)#Ct+?VtehF#S2cgx 4D[7C`o4&3{3őUtp vRfH; %ߑhݟ~1 \2[r'>UD*]e0~()ec%lȈF~[GqhKb¸{Q/(oXgH9I[[* 0 ìMiK.Xgړ{]b$=*\QNfuO d(yRl.8풠{w%XP+-~~iCjF m\#]"(fZzOzNj |V B/;wWț B 1Js y^a,$X㰉 o&0d!lc_E@+C%nT2m)IG6Qcz2_;/r3z[Kud73GĶc+4~59AP̜8:P%TR$շn3FdBV5C.Ý5fҴX,\*rERboMLs>zː*ߞ+62]mr/R]k0}ϯSle;iHmVƠK7ث#] ~Wvۤ c}st{ q.li@50* ֓e@n̾=d<aS[S|mFkA,:GBL V9X DiehǯFJ`C4_DI>iJ1cn܊$I۶qVI9OU+ j Qa{kN+ƁtN%WL 0R(}L^{ +O&+UHmsIL㗂tUC㿊'WMo6W HKl7i6]^.GJ$")TloCReYz- [$nQ6;"cd޵Jsp4(zy8[SSiвUL𱔯T C?=h8˨@3SR멐ȁ \ߟC8qfDIi@mr${)K`S1CGRTR%P*D) 4DٮggL CEH`LsK'ux?f:'cCQt;ZC֦, RQWsC|3[L\+} |>rbjMJnxrzrF2\.K64}a& bw}j<>|m9Awj9>Wɇ(:Eo[A|Acz9}GU畨 9r "9kuf{XE- &@:/(Eƹ?LuojLHJr'.$ϝJ`dUA-;:$ NwycܼH]4 l91CMɲiL6yDK|GY*,%r;۔b6gQ sJ4_1Y=\%$K$Ҙ!S(ȷ[|>$+,MQ9e"jx4+YD-`Ia*ܼN 4JB99TQgt!JgfE2T#’,L|4C@pğ\7%zCwHo3`p<d03:|o<N#3%}2j: g8\B$ # ,X@drA^so\ / 琩3 șl:96ܡ :\~t/ȴnzqI`Л-:od<|p?`3`}?@6t`^ g |LnDGo}2g׾k|~{u8pgiM=r9pCɘ 3".En.][bPTg`K\ Ѝ=X4GOHqnlr2L<lU%q=T^C( e}LϠy|}ْ.|~I#p겸G>#X6y^M(>ǁp1WԜSg{ϐEqt[^Z~Z|}.eF9 RU 40> 䬲#IWavAKEv;cs jzMxdImcIWH҂6QH7;Ѩ S3M~=Nrl!ޓ]e̒ʍX-+%Ydg K2A5BR3ɸADVKۻ>`0SB1'Ĥg8w/{[7%YKZ`ÎUfh(IMm?uru / I\;m)VTf>OD-NS-VGK!i=:aqВ <*O|SYigY ]AAEܝUVrW*,68R[Idoy!&d Y>)Z|CН"ܙ&WQuyEj\{%H0#'7Eo=sM$f$iukElk#Ig hqmhYIv&6Q8xb#?zKNh(B ߡ51/ %^>2k|4OxA񓢀h9b\- s*cIݣLNV%kcIvD<3r?]>*JKE?ϹDX3Gd8Ga-3x4MkUT< <Y ).8Gt^ZmAn 2s}nGi/L]ުT orG?,BNmU]2]8exPFg3 vWhey~Sa Cu)Q"C?9TJq~R׫)X4oZM!L{X߂T0x}AKiKT=eh67ͫ YCAAov7mۺkx5rW@^{/p!ch⁕ђ [h cx%= S#rM‚$8C"/n7kSmY82ig k^:pJ:{l1M?v}}Ž5bzfkZ[I`OL_c)FDUA.מڔ];8+_9i`[ p߂NqRy$4 RguLQm֎YB ]DC /".KVKTW!,Mi.G\H*BL4l_ɽ -l"3vV]#s'j{R ۞!LI~<=3r`HqH΅qC Xdݎ8"u103m b/9d+މY l#6h 6-^t`]fIaXꫧ+'Fg+!_Q2> j|ԉ/a>-?b[ꔿ-Ad9y4xo 3nsrYfs2sJث1Y#ZS'5Qk _Y@Y/\t:G#fPIvfmu>iq΍OTC$%tύ6iB}x[G͡,ܵե-KA'q9kXMRv!俲W&T8}K&a92'a PYI-d1SS[P&=-V^Z×|Խ{?o0wn}3ux3j1nҴvnO꾅`0oL\ھs8$fZMM GiŻWbuAsoCҦPhф ƿQbi('ȕP{ _mLvmoNشj{4Ŝ)lI@kM(*k!򱌔Ûĩ˞QPrl}} ֵn?~0i/pobz[7?ޝqx;pI\WXwV\pz~o፟FFc zlwvH_VY[SJ~W̒ L탰ج$CmHShݣ,2sps_2䋥"' HqӨO$!z:#eLpb)\q$)D.#GBR!s!WYr$BEPJ|#2zJFLR,&k)^x jIb 'I+O$iqS$fDKdY( ('G<# Cui܂@@aX‚*8 J2V"W,UtWIVT1imIPf܄qtV=R>*+,K qBfzCBFF @Y Ha ! &P#sc"dka\>'1"Xۃ;'&x=7厜~I O{{xx>'#{= bm69{D?<#y'=Nȝ iB`Ӫww w|ݱ Gm.bǙzO(;=Wf#>7 @% K&ؽu&CLQУ;'<Vjgvt`isO{7rY&|4};>ףP#p땅\YX"5Nٕi"Oc+L!"NY R%Fk%(<,fv' gfI9j7 K,-DX-dX>WӊXR*Zzh$/'l*Jä @5:7\سX ~L72֑~+&|q&o%TI yYa"b*eNٜ2:$MKک,+f4em; 8 Z0b-YYX )|>s VT.xZ x4ꪝ%2(5?AhDM(1ݴv΢4LjT:Ȧ4Օc (f]QO˵ZAYbT"@APKs30euBCi0w3wt:+GW ؉5߷f%~ՔB){E5=}E4y*BwZ}8]L(tW2O'P)k%\AKoF! ]'ۣ[x}bNCk-ڂ_ukpD޺-ZSL{Z hv|WtavwY\<-k#kq:ط,wGn.U={USdd\h_\zeQBU+j ]>sU%?6 c5Z%ǻ,|\OO ?W-)o[KJj;JQ;N-I4 YP4% RtHȆ>4}v䦢{N$Y^ 0|#>v|v!-1Z Un5Ef.Mq5~V;$nۍm~*Ai7=$ڻ69MLZ9c%svf{+&$9Íe!-m<),5:iʛu@TFy70U+kY{m-sd㽃0*;ˎEGuFjZsY\5q+nW8?=]_Grڬ0/EBQe^gEYS4s 3+/'yt`GyBe1(V4۸&"GRGο_Z2Ph1GbmG,uj}{7!S4%2e,ɱfIr|Y7 I=dM~Uxdw, BP(t%IʪFUgo$&;.K6y~9!t4H'IAJRܐa2iN ϦIϋ_γiZ%yq]۬JBE6JF?I HqU'"KuV8I~M/Q>gبF^p?2/f|LyYQU #<"3ͫlDP! B zM0"СP;r Y ĩ5VG09uZ"K'b<0(D: qG$4&.A\1ȪQ6e򢄮sD +AQT$; c0CQ- P )`w۳'{ ݽ͏Pdwgɻݽdhpv|r`} D˶~L$?|𠃓~saw~03r5ώker69;yn??vv{{|'g;ON%Hp~Βw& ҠLaw3$KL$>|O~s{ԃdwp{['{;Ûӳg{ǻ{'?n&ǧqN(2g۴{Gg{''ޟ`?mhKy}|43;>A#?h rmq 9ӫALJ79`=p>`O>$@iAp5ŹOG7l \|(vqx,tvo2_'?礸e7i|$][/8{ a~]靓 !)1\ Ǔ~OCi5/7U݌$*$?O'$eI"'>u%$"ڇN~OvCǸj/9Oht3-sڔWyQ+oV$FZYOُ -_RdVq]2eErJﰞ"c!t_)&%&yQC:o|ףdmƇ*d.kJ`o|B)Q1Ji:y6` %7fv{T8XFW"N7ޭͰ2 (OauzZ=*8ɺ%(e] \??(^PIW*Щk#8O/+rp~qt7yIeUv?k.7jhl*YO ('(vKI E)'9 l0-d6kfS _0˥4dk Sx1f;ނk& G;2RPDC c̲hN;j[PI$Hqg0. !Z ѳtD Rr;r`AgӬj}<a'yh.m AiV3omAן<6~7;=C'ߍbhm< oXAoza !GGQ;C#8~y8d+Ml`"JQ p ?tQ'* VK=z JRP((O9]ܻl2,WCW7 S7L 6ɯ`Jf ת]ٲ(l%QaAAL0?hl@ӸV{R|dڴ%%H/Yh8fFA0w 4x6ArttkwPn8/L@y8>R~jV KYE.1K,d-+ңj:A1 X:S(ƴ1"g`m?nWKSO+ŀ~s`RfTȫJxEU){B.̠%{?i>8BOG !RӅCMBF9imC>E2>iեۦ&n Z3K.m-k'Yx)l:"{|te&*'ru 4yrWbR n<-.ӶDe6͓ %hHߝIޝ1r:xg؄5ͦTA uNO 0pϜő-dQְ 0s*-IrLXMHk?E-J씅cfvq\dP]dܤ6WbҙO"q(c::I_#VGlߕ~4Ax/?T-E"mj{MԄB"+jק)xKu6OjaN҅ i(_)V5 ϲki79p[_*]#dRZ/ح,HOO߳L/ALnv`>7(]wIh@k0a3hOh瀂O6zvuQF֬b4QԨĪB%$1>Uɀ. =oiaV4gj?儞wt&} ٨DU* |~=iIoRUQrJwO ϊUXSڵ|\4ʽX pY;,֞s;3i +k /%7rOɩXaɖj~(Ke=|] i'ѻxam͒u@ЯtwU[˱!K;;g؈-:L@66w9L$ϋ. Ҩv=h<AY̯S$T+كǤ\'/l諃ѕmǍ+SXat: 'Uj?0WlCkgUDk~<%-ϻ ;㦶OXhݿtDgZ\!9`a腋72J٥Wf+iį|00 jȝ e 3`'Hr?H?=˅v{FS8vHͶ|LKm"$}m_?@>XlmTMz7NM4n XnO[xslV^)Qχŵ]Ž)yAT 1.XDzRc]·H~_eN N+;.\eD4b |>xNl>%Bfqh Jotuׂ wz/ I5&lڵ"s"Nz҈TsVI*Ez_v7PB[_ Fn AKo}5Vh͡=$?.LbkX"?yOf.'"WN5{Șu›o˭(ބ\ $C*"Ia7w@0$eªNt4B;5s<%}=t9w LږD_y+o팳2yo-w 88$U>.y ұWϞrp҃({j8 >!b,*nn(Wل$%d6\Pٜsk33h]&mmܲ-~"O^$wV:4mKGP01bҭ䜀&, 0`}J9w=tdT k D4W\(>wl?z /8pl7rbgfkt6CGeyd_k51k[oA-~~w W`[-Ku]L=WX )vdA.6ہK" R#,jG՚hlA .sE Q,+mHV~O{COzlu!:$Wan>=o[My&B(\ Nr(9e%.e"V#h*^.ʝStjOrSHďY+eވaҟATVwx[4~N"cl6" tZLj6q(n҂a;JZ63Ó~ĿV6 ݍ&M66O6Y 6?: +vQ`io{33& {(YăKBb^oNϒw{/uN>ρAGO3W(J/%;+R^L8СB(n\_ȼ=W~T~Rk8QvA啮=\/d1\lil*.$8 ]^TM!A&dhnpcT1HqwB]\-&{aQgۼ҂{ kE,߿8"xQ*~1$,Qo7+ǎ-u<V1=}ArT!q;D_VӸἜ^ՎɾUʣY I"Uʙ'TC"Jz`lDQjt?$F=Ь?dev>!'>2^[) Pj8V4êމjף#cosBlbN@K:o*N IS_u+m+[ަ~Ef2\Fm@ux{N+#35͊5;؄aÇY T<i8k?t3Ƀ4FCj_'ЬƩ.o%NUK6ujg)a@]3\IgkW8ðJ 4z7K'N=@NEuL1y6L.>fumasmb r,7 j[ ==dڭv{+[$:1-|^//Zt4e/q܏mx>ݯ1aOͣ&tY-84rׅ d*Ĉ GCQ5g,SU}^Ÿ f;oVW0Z˵M8C V^ /I"QfBޭ yT< :Sw -3Xy<ӗ=q~;§p] 5r٘&E-lڠQ&R=UokyZt8JBe0:AsC"}U@++oo@Fy׸@{T)'[R0VsuqѵWWB¬`9sЌMB R4μo.Z`ǜ k7W /b ox&ɲ\_G2~}hda XZ†34[9[jbiڰknZuZ<ތ|1u_Ό^R{1[tӨ~ne/ۉs3-G>K.IE CW;f/b9f{h4dh +kW˴de/܈^a4J""gª1q0F;)Z,V33`зjRd|aCo~GkU{ŃR>eLaL/it}$(C5)#ܵś3¸DM_u.|t8>(X7gozErЉ83Ǐ]+c9Xa2!=0?Y4Gt@Nګs , xc :VcLO:|iBգڄu}ɋ1)U_d! mdS$xkRz{7k|P"r9Cc'ٍ\yIԪa:!,"xiqqߖS1;El̃m"Z zz'̯zU2ĻߑZ+>w'uD7iKt5DџfV}#v^Q* zqieh7=+?x` lȭVrt4B3L}Knuux=yl<|Fhiu|Ń%o!l(b`xo<D7l,+9kUrBB/j:TFC]y\vP4hl7 yܜ Glvԟ[BCi \~9$@C84 6 t\+0)mTSmCr+tHJ=7LJEڱB=XToԵQw}%wzVC}oҿ,(X2o4RTgkʐ x04%JS!|Bf8C u1;"fj#w]tRz6ޙCQŸȢoMxXwA\DnJZfέXi^d9WL`޲/7̵@hṈف2Bg q/N}L*[NHh'f^PU ?;3 ҕeZy=m[Xbmϝ XB_ِFS~N"tJnm0:ʈZWɻ]yC82o..j&Mj.ʃ'^Fp Uj^zװ.0 ayy*!F!}eHߌ5fY l]bCk{|okNbGט]΄+χ`HҞ1Sf̜(/aa"Youd,~qwE.5 o/Ɗ8y5^>E>k݄Bk &xUШLO~e)kSA=ϨsDgpqq]dL4;OÙeᆓ_e\K&vPa6Y\! ^7Ov!$Wŋ2i 59H\H^磐_tav&蝧m3!~q0g.ka|;vjܪ/ZnPY_Ad:IN7O򰉐~4+xYjY9Kecni~Lr/MojD{mGe➦l OkVn.W(7-t 8O0gEI|xGųgM[PNffl4SލN3T²^O㲭RlDY-t9;TUo|X!bnPY\6jݼZz8%k$ӹXF])!K~˶qo/w1kmxŒ9r.ʎ<ԟܰ{4Db-8*փBUL/S{}5<\$gbmt\*pR*"EO-|YOK#Q#I fxCAaSNUV TCa.PJuADEz fG|#rE=2'!0\WB fBO!vVV7Ձ! XD e7V߈˓w-;Eqz_%Cɝ0$XT_tÞzrv0D"A}lf ݪmm$ɣG @ CƤ8V _29ρ<{\7֚|^3ˌ_5s6F+عU"}꺿+DRa=Z=,ќ/ս 1[`}?tZǗovKOgeX3vV?W:A61ɴC~3vΚo=kA q,Y[?n={z5 >\/XMUM2~r9_eq`{n8,W"5RK V3jm@h3xP jm$V nQYZ.8ߝLdX>..'dT .weS`Y>gL_p5L~V2W>.idB#Y2]bva—4rfc Pzʺj!x{R :юWJ|n0?PG[V Æ'GqlixTzP/Z\{ i]Te-UKu/$z1A.Cζ?ek}>]n ӊC/4rT ^:_d%?S1.26 J1OP8\e鄳hgx F5W琘E|49wn*=|cu mZ^+& -?ּgT9/Z,- X9ꀰy]Mt/ 7<R`τL+ 8^ƒ%VF }vvg&4l NE2oYJ<F}';`|*d<77,M^abIȬ-/ vdgg'b  6/Z-9 EA6e]eysmӿw^哻K@o J:'OP#j _dɋ5mG^>Я:l#4?Ƽ$2:On|25ySRTK|:b6EvLrᬉdmA_g_oƹ.v"Ǖ~MolkOjQJ،u)`NGCA09+$EK`Vv1:4]Ս<3L^mtKؘv8ŀ% b3u*?\M^q(9Lu9Ųۣ&conXB` `t<)EobBAfE.P-^e.+ >ik#S&Nj@Ĉ/ꖐ)?5zמvkhyMߥ Sj(i= {Kg`TXVgx]~AQ@$RQcJ ^BeA7EKFYp wq#_-ʭ\vy}`BXU6\zj52ѭMM  fQ"<;ôr>tlFah~4`CXx02CfQ/yhYsa<ƤއAS6ܷiJïp'8q8:hJאXӎmvpByYzI 1sΑZJȀ=TB4 -zJX$\2[ 75׵h:8;Wli6_X ŮgZj},25yaNqVՓ}0,;]ꫩk߁ey eD"࣯ĻtاA9FK :473iLt~9)9OV{⹙ ;C'6x֥ntj933#|Bw j) Y3h9hIyk-tBoPO- 'R% {* zuPͮk  7z{̤v|ȸ4sENx -U;O}QQ4 lq,RhdS%`m`<监aڍVYx"VO\+r{ "!U;č~9гzګѽU'O<\eMh(Ŗ|BH]G,։7ΓKRGEM`ͥ`jwnkg\'mTK3"2G?Qh_{|x(Q`+q>:^C>`B7]krx18}*w?p |w4b-umK-Z6c-Ffk_=q}p[K[| 69gnpS36e5*Y{dnrID@R q /4}9Z<64rǾ ̷\O#^?>P H/7@ =JA4!z\原_"G>e]Lb56}mr%Dim+w7hWd7upߎ/Ps5jOw/[94g[@TRhkF4Wp}"c9&N\Oh9OtnyФ{wMu͐kKB|y}Y u6[}s#l5'uT~޴Z;^‹x|˫Җ|>i ]X>ԲC1QcS.˗GF`IRG߀HRƻ|^qkRT~tRsK`8W~ m<߻|7#5[^5 s4UW[VUST.ԣsF&zf4߭@?pGV 0~B\S'h#Cj]C૙ZE:K)M6T{4FQ1 ueѱu%٭WCS%{'i:;V8;&g\&wGwrg?dsW s5'`8_Pؽyںgwu_0(Xp/ \Byߌ[^Å[zly[V& )&H|ŻL:42Zh&Ƚ;ޔ`fܮ44gS'Vl&p^vВ] :v$;,)C>%+cۚFgFUl߆x>aE,6N<^t1/E E;"o^6'V[] =yD!1F%Ksr$| !W:i>mAfj` 5]M3 wQvuFЧ L邉hnL"_bLy5C3?N2[u$՛|>x3uh4H_iZsa>r`&X`z*3&w{a7׾KZc݇9K/8ʧ`)7A':HT}R#G.)xJ1Ii/* dDϦM%,#,# K3 ֞AS>ǎqa-ۂ֛ܤ_>HO9IoBE_oR{*+ /6}!JzCص?<;8K8bhDǏ 1xW*t̻9aNOtqeҐ o9[I3ťqaFR]-TPї[3j:6kuVeRricNZ޷U 7YR47F^) Fs#_GM7q;;ԇņ/CZ\:],OOz|mP觑g匌ۢ ^TzGal2JO`S2 !i>i&4MJLTӒKvr+b:Ψhnfh ^!sBCG>HIfctnCT$Lyp#xq,Xi{+pe0G|N5| 簲=kATm6$ϬU>{p2}z 𵌀W?[,vd/ z35yHB3ǿ|8:s"޺VqvŶM4>ɪ>mW䢇_QQ^~8!"e:!?ɠqNa)t7̮i$t3|`RLT T3~̍VU356`k(*<as"ìF>8LfsznO&- .Fd.kko@{s\<:z~ po\Z CelHVUx(t 2C[ėvgbX ($`j&+N /\Ojg_9jŠІ\ vW?\#<~)bsmZxP#]Muo^T FQQҫiۡ*0Z4almk_Ƕ; #2')3A9g)wah䏡#E#+@bcaރma/o:Z!p3ہ2? jqey%ɀDYl0G3`͘C3CMAXK:.[vWh~ Ej ]i½\G5VwQH=4*H`2Y'Cfa. d):$aElp j/1;%#hfiX>"ȸRyr"[*/r*(Dz6NwXPZ,a!<)a+Q^h@#PщY?(^9Jg6Rz#!I SXO׼סR"m|dwW$(qQȚ8Աu1T&~ȏr~]T c:d<ʫ>/|q*b ddfh #9tn?]7<Գ^ʐܷ_9g$..M_$k2U^kR:䊢}֟s7]VmoFίTN4)~0f6EU[ /^3k@Jg؝}fyv7s)6ϥZ5t'(Vtd .LTKjU CUlXE EU<*4&HԽaX J YfJk,T^ /8iZ<|q'UB2'd ^VAq zn+hX40A ZBUAx k; ƩP,#N1&u&[Lu RRLZΗ -K%jGh7@tC=>c3ށ=89(O⚣#&4ۻe0?~=w9B!v`{gEhbƽK P4#w/LF/pJqƭft;ow)E~թ-C'(ߔFR䱜YB~%S饈b'}.MU0U)A&X'blkP2N6Ox!*rݡg0:=phԎ?H ggWR7nP;NO-ؽ6f\fa<E,o'!-[ tGcݾL{+nQ%z=q;ֲIg_ 4l~9]iQ}L+cB;u:e*rs_zFyCzPhCzl8})ѧ<wJ ))rȉz?yF`Fua)O! 3=.9Yt*BxmDxUe}0VNsi/uT/i|k |;;ж8+o@gBXgw{m!q}T5lBaQ!ʚP9bӟDphX횽XՇֻj3r l}eYKvNf gW}+-d؂wp5F=0Ш鉠q,7ДE>Վ w+xOO*#8ThZ%v-99` !$:m<#|B\c6VCdB>`gH8 gr4ݕRk}.3C"M|/\x3.ϔ\Z[w ~C(2rJ,"OۓPf"^$+^7IMNsK`>` PI"΢8trq-ӂ.tcѺݛ؇ x83h8b!x p;.͓ |fC|gQ NOo; Uc[7~dAHA#*pܥ쐳5Wns`:%~c?E;.NxU+E,Xf2-((6Ȋ

y䕢Յt?qYF=fꚁ_uXLzCh5΀mؿu(ͦ 0g2Սh>hhyFt630P@a0 3 cKNg1w4ChZfI͓13#.ꃬcw:%W0mH}u} O Җ;I("BC{>]̸R Kj&<¯;)@/'1ua{^cDU. G b@4/NVsNȝ{\!޽ׯYg 6$s'bqHbq;EX'}#p017ŐGϹT;\4I'+uf{wPgJP{<7eB*QNriWnlu@ttu.Y[m'0oah9'[HB)〕U墂Kw Pdm45^mpQsc{$h{ T0iRD l- pZXX / !6B"0(Rٺ:\@.A_BvY RH޸ $Exy C}q ;c6S/1&!on/>=;KG,wEb=h]gG/,e-O$̗'Gn;htDHrG!7Q{$}{и ~[WCV)^QV9xf{q8MB#;UM|Z讠 K%N ' =<4sma؞Mm2 Q%9>/RiRk$Zh$%%PLK^%,iu6Q''MqJ2V7 j[THTJjk)sm-*oD_[e_v^1}뀋.B?Mv'\fDŽ$7&V' +`)5uBbܐD0ǶppCnDL 'Wb9ѾbGw(P=q<135/mk/T1T\fv_i)bIkxN4n){":kCZ]37 unlq2ԫFYVy.6/wYu$JEC餛ŚډA\B ޒdo+sd.Im/6W\kYlUbJ\zz;R%ѰRp~]S$Z~7h*cBk4 N) ZL?|^K;hIQ5JJ͙1=%+#psqJvA4P T{W$DŠV^Vr*/ܫm8Hml>~i:;QR\/ #෈SaVqPCVֈʍ: sx,'.eؔX!Aֆεl?D :9n0Op'5]cnuMEo켽P67'وjP- "T0DpXo[޹#rb!Tu?NWJߎn;WxoO0lu{ϼf>n=\[+wɑFGPgN /gQAA->"_#Ij.zyJ>g+t/kop'N |)=ƼG {I[lN*Ez焇;hE%>]t=렳OaǩSiҗ|-ccϵtf 0[Kq`>oOԊp=5zE,Bf[} x_׿` kBjm,-# -gWtW-I!=ڑaTj9O\[rjS1 P kXxǮ)pp򵧷>wǯLc- wVTJgha9Ny0ofc-CCxBGYG,NROqͧO&4?Z>OXBCPQYZh@g0-=J`ƒ`?ytxQ;O2,B?"ǩC#icglCX=2H~+%GCsP',H(@_A:gP,=Fؔ$ ؟wc/"a3VQl1&%<`-q<["# a)w(cIg<`?3-qGN3'NK~.x0e85Hѽ #L~fgb!bOX0SvM)%$xc)kg;s]~S2n/O/u3t ꧲]< M_J޺J?7FR!ʞk]arPDYbVe.0U ij¬Vn;t:;:^~_mM!q֥*`_} ?u(^Up)x.&K 4Y˾A݋jNK-Pu)9(l=xCGUZ|jN*6\>:gáYŹ̇ky6s~VSu`*~`u3GCT|6yFhľ Rm.6z(UhSjG2ЧV yVuXsfy%v~}H6$T@d2}N4ly߻{ҁp⾶}۽ݽ=)ۜA^dQP(7O5 .Au߾4] $c9d,g= uT#MͷE&'!~@nyi5xn BYa043`!l> qP0ĉ!JIRN(f9 j9S( 4+JO$iLC(-7 7 b?Z|G*"hgEr. ,4خYRաHq=_,x~`,Qwmڗލᘀc`L# 0&C<s̳~pQGQhЌ-?OuvOGB!cLeb(EOK0,"_ c(V6})ޜ,tp_lɓ,wX"!S0O<|5Q mL]al_2 t `vc _LkOtDK= 顔CEe#.,@6H{Ң Rn!,D\Z5k*GU)HexR,K3  #y) G P%aA.c1H5QpsPTާCn$LT.9+nXi \3*Ϝ-OިqMeB. xXMloBH1%wĭTy4r~ű< .3P?]]àK|?|^m?vr={ßهRpx@-픧Vl 6%y4q?g1M3+OzVIל1lNxjPU/-Bx \3 + {e2Iѕ^MaVc]ğcOPy3Q{ʔkzDZJ=M1§bOP *bid t -R4ZC&};C^G UUf$Vꊐ; qVǦ/t$CKS,klpcl>H'c7XnCFd Qm */N_~,맏z=<"wmCan 4Y>e>ʟz(#VG*D8rMnU {m|['H`HG6#T"!nϑFHZ-i4G+;dr`}QP4/v1ƿ-t(*yaP orl/(Q?6u#0;ub X 2|}16Ie)CrYwDQkɫ:Յ>o;QOҗۊ%TJӜ{g2y:~|X-}wb*K}gC~lm bQ\R++oՁ?[s ĽiVӿz_(T1+< $ qo5ms ~x77/M7.a b?)@6H֚ȇg-7g[*鿥pe"e EFlxpUli3 SL $`bn@1}EoAmv9s(Rx:{h}Uz{*b86@Z@a1jhcT_5$tJO{#~˝ >uv*9vhdJYOqknqv.PɧF4˒. Upeg5A22WQnA<[ks6ܹDfEQ|4sbO$d:7 I)GuA$HIn:Zv}awyP"Lv="ib)0\.9\銗+4/<,H _(@`:'b Re2#"fy"2[J^\b3%&T&dƐ<-9=9<~sqLV&.8go` :PjAkuls a3T{I\弢)> $K) S ,Na4a7r.5G| ^KK1T9v` Pyw#G2aHsGR1[)^1/\AZӨc VsAHx0&MImAXya/ax wv>JC)a?H"H>9߇5=B `}_he,<Tdbf 4gɡ(Z$bjPXQt"Z)xz8. f lQi. As ~8U !i[WQC6C9AWGULi}:ݛ$ç(ξ^ RB>h$@ zH)Jz GEi!dӂc0(A[wCLXKWxR3T4B2zU~^u{BX=}MUR!SD`A" TT6`M/w(8[wóLSR9Y|a{M U;^Nf=oMzO @jtw[ OG[xV@vcv9-3eG0(}N!PEf1䔴iT6f /ԴҷbڡGdOIXܒݩgIŧx=}H,Ad  .ώΆ 9JV#2Y"Hژ ,K9%Ba0:y@0} *M5_Pb*i d.P|b9|ĸp v[4yBwc b+El1b ry.9a5KҪxKTnPl\^19lݢ Rb%cũBWG Д<.L#`9PE*Dy+e{[V!^NTY0?9Gaa>j)7&?QZQz7X1{U,cXg'qv;6"IsjvfRl pF+i{Q2~dT\Z::S߳5Tn3R ժ=a{]bIx(K&fj匠uNVYj H͞Jh d%%l AqTnDfҮb"SԎ؜M.:\7t08;<9{3hxIsUPqwzg rs cD֔F1+Hۣэ]~8A?fd a7PX`+ &m tRU!J*0|UۯcVޢWsmUJ;Rܞ (2O{0RϹ墁 D.׫K+5MVj{ǜiG̱]a?Ji~ Y%(M22S(udgؿ:WPe)SuF_#Z %jVhS%~Kv| ynѧG$G¶&fgLx4Ee[~<%Xd!0x GuI9J5POc8[Qem055^HRU/y{Qf^-NKKLHB=yR1FB90 t֢+P̿WXs( N(6h,KN!5*}֙n/usP8+ 1kr b*&a"YSZX;tNyVtIgX1f//[2@jC{uﲺ ~yZPj7 7|bkuC -L~![[^]8}Tg FZ4l% tXFO͂ado46qMG\:`Ҹ}W/)wٷ NIR9*DqXƠC{AD;opX}3ɣޅ0+x"%j'ּfH8fML"-?1A@5¤G4pjr&Π ty2>ϖ Wb0.'JvMl-P~W`1aE)S'O"`+y "E]PB͊&%u%>Á{ta f5Oc.8IyCernwS@Ckv4TC51KZ벚8f5bdݯהǘQ4EFCROQ].sV,|~_?چ\w۩yv`ӻ>7;UVv|K,8$=3@RO$%Y2:՛iu~{ju!j,¯J'^TV:x=WePrk62l5 ܫI噒pznkV{Z=J]oLFj- d\J>EDj_Zyh7JCjM|XVI=5Ґ~<)X.^0P<60?9kg3z1=WASI|K᥆+ڨ~aC zЎ{=#^bz_&R'A򊱪AQuP.?z@ەpsݮv#_ ϲP#~n7^͇Xb #ǎO/)U ƦUzM(T"vHF:-wD5jVۗ-93gcCù˃/]eu)۳YM}L`Hnp?٬} 1&]!YW/3T{NEzl._܃;[T۰e_Ϻ"mNS%85Iul4N?t1Ĩk(|"^ETYS$GJ[:&ѫ-+9[>*hٹf3-;H|U]t>j~j$I-J2w(R?/M.;x+$`2c]e3 yq:> VA=끑XsͧE9d+.!Umsu\u'pȡs$\i1ܡը{L9 ZFԋwՊwvgm-i+-ۥ͆?8hR_ԘzMWuri._zH@Jm:Ƶ?"[v?tGfLaC"+ B3`3)gEw* Lavf54.20.4encoder=Lavf54.20.4 YL3h.Z?( ϯ/\ž1t9*Qs5D i,14dlkH흃<̽Mqt\#q$}tEC JR7REV|]n$kTi< VGy)zXDm|v}pnk i KS20kr8cBs$ԥ05LbVff,ײݾe jKEjr,ɭF}ՊQ,𭔭,& [͐[ Vpr+I#g<1 (S^z@$E?sЎ_{<=WA Hi\޿SJ"3X7xFxX?/m[ݴrq ,v$z7 PZz6]):Ư&أE,N7fQ:bۤV`?baGDa#@iSάAӛ]T,(Ym*Re3LZ|1nȉmCDiNFۜq#-]M) XIHa&rX[PbQϕ2,rW dC-UkD~VT-K5$",8p6\W)axfVsDqǰH?pI=gΉ30*j\MRtn*_sheB賺*C =v9y[m1 r3C,]\)EW^gf*w4[Y#6U.rkM)C -3e/Ego2W2Q)0KufqRzgJ"N\xnyj& iJm][tz F *%f & M%Y3(`!!0P""z;<#l?&t|[fK@L|!r|<@3x0y-c2$#{DFD'8.yeS ޔĕbϽ5%K#ܹ̄Q|q[>2IQfO)_[ɣlCj?ī|y@2kP>".'Yoۡ ]iOJv>h::q8e1T$48ЫȰwɞ|\2I٤N!yyD1 ~Mq N̖C$2yюf=:a[H;dI1&28ʁ"!%/<$˞YT71%XMmn|ŒHwB>j#ܕYBJ7*ycfia^ETu~hFI%mw:Eå4y4mq:-G7GA9>6fT bY #?_״_q-;t51P=)_R C"ҭR@GC.'B*)4hU]dX\DP>.C $l'd 3K|)b b;y4ȈHhixKQL1՛^UrFt&+y! 5GnJˡ%G•<1^N40/"ɪOnoK%q$*!Zn%OҊѶ!%_;@qRD5d(d^Ӈ}eyҕ 2!|-*u-4 t?bq(b;HQLmAƅX؆EE L0ɒLf%<A"B|.C<>D|TFyV }cjwڠ:"0zRD7Z0\N LUw0D :)wc>8'-#T)ݍ./h)ZB|,|S?3$[KSxhSfB7 @Z=6̆ĭTHLNo ` YtISR8AuL|K)A.B0iI?LZ)d&@HOl+ h(YZ>as TP"cD](\hBE"QCi RHǫ##N(@L2$H/'yʷb\6̐zZ}:̺kRv{jPsBVR]\rȬ. Y67|^lڑSX(p[ܷrDӕ]#R m[R_?]bYEsH]x 9E)7vi:kO&ZRk~y u t!8QOhDP0@!f-z1I'F'`oENq,jr2,o*2#܁R8#Rϥ:4;PFǟ}Y"d %-0݊N5ӪT"Mp8L$M{H>0*rE.QjLa/r>Ô<ߕI $r;m,VFy+ؠ1\3q ep~ī8U'9˪~>%/}]F8WTShX㈽)ÚLPSI]qSyn% ecw!!A'(ֲ'ʖ?UQ䚸Z|ܽ\{`nKT1ѡszN I(@ -ۀNwDA_RRkIҨRT%W/f$^@tqϠ(rR=0FCjջBܼ<357g"~ ;Wyֺz<ݺd5h5NT+Kǎp,dR}u,g>q4Gfd7ޔ(0'O4(קwX=۫$5Ssn_ |}<І]Gƹ %\3!%x35WX\I !5r.bՠ/4X `Lyȯx eԒpRN< TxQbQN\2n((-MD%#rLQ t"_ͲxrM.|SstYO诟^ﲩWHl(.u+J:)ݫسvgV}Z[w2akƳRs7Н A}JVXh'؄`F\8(:J eGE65>ݮ˲m ,GDX^d^_qBCvUEdzStj;ihIN.=Qgnt\HI +Rl=u~#vg:1C[OLEO}bvZX%gYMH$Ԁ4=4UBOf$eZm)P_ - g˺(f[X^`֛~`Mzmsvg4 `cbf'L"zupT[b(ZQ@_Q9I[#dyWi6 U dڜT:W[;ݹwml-C2Q% z/U8uߒ"^=kZCJ\OksbYxdKKj|t̔}nێzGI)NZ*MתƳ.yDѥޛ &ﻗԇ,!0=Ny%ٗJ6T:Rv:X_/]'1L zujqRY[Yso¦ܬGWzHd@'yG`^AȞp+@GݬzB9[f~ W[!!dƷkgҹ)('ppI26Z eʤ(F p #at)Di [%yUz^Iy{l#T6WIdgSLcv6X?-_~uj^;NrHQŚy,]RJB/׋Ulҧy^kWQU9/TzC~5!W ȼUǥ#@rU0L% Q eУ'ߪE\ 4+x-c  P x 2rYEj9IN6GX`k g^)] 9ApX7=_ar^1|A(7fJ.Oɧﶆ,]iC~P _r#n̛QMJ7*EnѩlNZ7+ gKpݸ0LDˇ"gܛ6n ! f^F0 gP,q9LN1g(KY.ǝ%];ʼBF ˤi:֊ &Xq2C$2< $ $ $ $ $4(;MĚ̍.j*5l[>lqLpEiSt8'Ag5;E{9*Muأ"!⻒mՍ/D}ϒBDsjcUU+* fbCh|Z|j&eIݱ?UskxAuR />zj^Zc~ށto'/.G1uuvNR{ qj#y;ߝ).|D}L99֢G- 5^-HvyuvCb٬F*,-/ՀM˭},O 'ȭ酫5 Эo+%jfK~kޠ) DR,rSB}*>ّunYⒼX@V% BOu;M̦/jS,Z<ۭF֣M 2`э) -+ߴfMioW"0UT{Z8?GD"rP(閧dn=cW AݶU7}Zs%j-~M].=c?[KtX2JRRLSʉ4c:l'GNO_j=!*F|O;i|\ Fߐ$ w.|r-* rB^1{ؔb$]LR@HGItoL7J^G񳬱WW?낂;{Jޣh_32yD/g{Tn17C10,\H`fn\n\>s-nWű%E7JۂW]QM7\Quاa2}^UtaHMLRݡT]=K 5yk)WDyf"nL\&ǝ;EO*`G:f\n8k1&XX8wlBB-0 " kC-hD >b[/0n!"}fAYm 2PQ5BxrLYlC'Q)90S2Ɠ8L<0r%h.? {mC]:ߢow-/MrojrR7E7ȹMz+uRR4LpQ2!r;J<[R\TKuq[+eշ:V?~_\"M^ZZT<$&CؖQ}y/sc#Ն͆4+#ʬ^/:h |+(L XwOic7'> [pQQxňPHD@ V;-p LL_[r h*g,mJn[BAD@ 1ga5}\%]:ߢogr&* %+qN[DH~\U!#)*9[,Ĝ%)×TKuo3b}UXRo'ۤKLTZD{ԵJ_$9h-#OyXl3@)+#ʬޑ!95JKU!TcەiI2߆ uv|Yh"0- (MoD@ V;-p LBHܑ SDQS=cl9 7-f j䘴 *Cؒ\%,pHr0I20Me@Y' #y7$&M_{>UYl@J!K HZ{*gREVuɓWKBl0fIP1P2,bNx&ʒlDչֿL;3=Vi \A XQ\U\ͤE ];ጽ4sʓK?. dG D1ăZRYJuH_M]OJP0"=AtƖ2-XtF=-$7i _ sNrp9OǞԚ"}g7јqg =E̠!$,PhC>]}YG<}eRrvgѓDAۓ/ i[kV,/S렿{kdqBX&ˢ|t"ΉGW7''&&ʞ2B=. &R+BYNzjNGtl,l@1|B$(`pURcy[{do)Ͷ?@V~6 LvsVG裖X_"L0bI ̓/aET9ƛV]>٨_5f)yhre WI4-ޤ6fvvuRQ`4z_Sy`IIKMmw\.p !#ybYsF6G+nG(򴥎w6-'~Hr%ԢZ>)tc-|AMꚱJuS(ݩ{G\>I\ 8s^^߹A|Qnd (D%-+Xn?8 lzIRv/:K]T#!Bl*=/gPQf3 /UhKZ$IPw]݋w2oԇzb:,zdJowX o1jܬ<0)ZAd:9"Nke9Y8i8&)D;u#ޘqJ +UM%!sď5ް4aWVU`@XVG{@L STFe,)5)돯:Ғz {|NU؉-/6 !2*=n<7.6dWR 1dwɼuBTN֍ܓ~ߩ/l O 5 Nv2Y A}y9F+E :ݓw9#l9PZ4LeS;A@I;qd<:5zpàa_ f#B,|˞W 3Ĥ !&-;TVZ2J*2ֵeSkYR:Ŗ2okR>÷nKԳ-^-+J麭jÊmkNıK*ŠǨbUT)RK%~I"k}J5kVql[Ӟ,[]0]}.}J6 :m_lAE] /Ϣ -*q,&u:rQbh᳾"vg[ns< rOh/: vwFOF/^=(1k䐨g0 X'53\2_LI>%%DGFNsU?@:ƕ *̫jyTTep彭K.ϰے,j׹- JҺp ⸭~m;ӱ,zʫpkꞢ*}U#g{z9^.$MrwoPcפ왭+v9s՛v`_oo_R}']X-Vն@9D9)8e :B^;Gcw q'EѼ׽x/slr|c$Nŀ(IE\gF6?/A} }?`A4"|˞W @N' CX`3̢$LyMweH-b6mi,uᓿX6cɐFp%yM ݉-ḸG$0/eNҙU:ْ*BFF<]mQïn0unՕ@7Rs1f.!k Om׈1=1"zDm{J~'Wo+E9?[yn_oO۔ DXޜ( ⛨*:WdxkPZc \*ةXHLpC?f_{eP\`嚐zՏf\ )5ULYHk5M!Јq vְ(r&<,GWL!#g. & &kQ0_B*4ĎW勃2TӬ75hK Kace6EA۴Qv]}FY-4'}f "'8(J0c9p{P"+N}cM¿.o] T(~4Ζь F4dڎs{28[]܈.n34ȱ% ӊ/گ{ɮ\_ n~3켙JP^:IUAl`P92eOC/( XnT+XALe܊[MU2T[ub q9 @艓VzZďmI* 'H~\Hxڌ *ztf/ɫ؆a;dGhʪ@ܢ :h¼Ŵ^iPSE>z;%ޯђQN=M$0(]-1H;,jrAmURRsT ƒDQHJFT Xv+2Vd= S9gLr]JQl+@+%榤Dj fgoR>-mi/ȃ/ʿrM ɗkFt%*5OcQs^ "'=''÷Gwl[\Y3Ȗ߫;~/t":sK6?Ӓ>뜾|\9i:+ {卾!8Z+eLC\n"W6CE\&R2*o1-$Y|_~K6Wk `)$ϝi3Kh#XɆqag{MK2eg! 㜺 yp~$UvC!VҀiX/#)OכEվS{ߒ>}W=k[/(Rjszp2jԍC pl+ܫ,34ᔀ\BF_"+ƒ4&JH0M񳫯ٟ#@~{yRljv_ԛRILE"iӏqU &Kt P` oo|~~Z~?RF1\^UY f@,&RAڹ: 0#d;6cb`%}q7}>X`bʊjSQupL~HF_wd{n༢&K!dLd{f}u#m{2dK/+vx55}MH 5&{LI3 |+JD_: . ^kE&!֭iM^%ԛRIvPT,o 9w h,N,Yӌ$J*(x!E%q}e\tIdI>`hjvjiӷϡ%llG`'k'9E a`iIvo*!Q7ZD2:lh Fa@J~Jf_CC˘(lc@ED,cE,?;OCv6!'m"ב/am oF 5,&۪ye[OmCeO+^RVgAoOagRk)WzQɹȤWTB{PꇹoUJːG˩~*(Qqu>Y*k<ҩuJj>(`P \$֐Y֠i^ +hfqr6 RlψEfr~{B$$sPvo˞h"thd=YQHVv[{€oPWf9R[&1_(>wuS_Fshx&ftIv˺?Bʄ\]+.w+F%ZFxMe+\q[!}c]|k)$$;BS54v~vs~LRud?/oE -$f᫅n髆jfljp>er\g#RkЋ`l+21tKd ;z-H:V mB n/IPn0\β䉀;L[Tnq%"'G (p05扴n$!µ>LYl(eHϭ&eF.釖GvCk*#`iiN-6edavq17Rʍ4]V~^֣ DdA\3?5_Ŷ%L*?f:CYfWPXSI5E" LGG2gL{*,y k*H6ijkoxex~k(Qf~Y߁Dϕ1Bl ֡O0ʬY Wg8yQsm|&;K+zЅ!7ΔV2.](PN$%j[y}/ɬɬO/5397AC]+xU@.z&D6%E io;{!H^s5%r \ KKTS mPMbt8m9TANB_8xryηY6~{ejJeߙr嗰L"{$I몙8 m&&vOoeٓI+\tLòI.Rw)iϸ aݖ"OGDXkjqڛmYx1QDDDEKD Hr"ʗJ 0,K6\ˈ\E|a $>2{̜VbOLY729#V ˆ K9I "e&ٱvlEKkOL{ov $dvm-VYp\Q+ߴ>^V<%k ĺNX%|+b.Ū#:-H'g6)L3x,w5,aGؓ㹟{QcZQc;1mAB2*a[PS(T'DDUk}$VM%'h,o1?Zz%[kW. 㼊*Iv㟢8g IzԞJ9DD$ G>!"E5}8DYDiGE sA$i{O}*V*GJwGinCy~Sl'P]gѬ4GMb"D:(E, E }|e2#β\~RU .R٤G6+IY]Dj#^{wrvĈ}H,?E/*5دr,{8G\}>+n'˅ R~Ш :,UK;3Vie"o}C8DjpQ04-QkxI2bIݪTU[tl99M; c‡JvٳM*_M{AXh(RD9eډluPŁU(J"e)CLGeQ{]d[I]mCW?F5bL;SV$_$rBiKAd[Ƌx|3Џ(Wg:wqwU$!: gՍ\žh 4ۦ̑aئ<2 )ۿ#8D0 oxaԛ/ڋogZ.&|I1NEhڨ;+S3,+*iNJoacmkysȏ ](_WSz׆)e=EP"nq~~ ɲ(P>F*~'.Ok2#^yu.N'Q.J1EPHBq6RkyǾ'R1^8-qhbUM(^kV!/LݠZb qZwd8fL $ND@ "PǻΌK$Jv^˂V1jݶ$hG/Ӓ1ǝM^2@tŮ9UJu NԛZi14'OeJ5V#|B]ĺ-xzBN \ jrZǿ暈UIijXVUsد:ۍrvֶ,c &0tY[WIcn#Ք,bY+n|QIگB?7C0v5B>1PሚE-} WB4ygxMn~V\sp+[^(`o.^(ڨ*<<7hc,(TA"y/" &D{1~: lKBA>}l)'x̚Ϝ~#f4Ѹ:i2_[??Ýs.гLe(d ,KUAiҦϕxsvRp}H̱~ʰs_ZD][ޖe{[Q(6ipHxdu\wUAN+Jk;$@*h3^4#BRJ+( ZP-5qjW} ̫ e_Q.r>Ѩp%62Wj$v]%s/rc9WDłxR -Uu*֬tڥ6s)5x^q/)`gh2`v ѭDG3p&b"g?1EkSt/4`5 ̭DZJ\T9+6*b<;eI0͖yc?f7~ vgK-q-E5 4p,?(J.?_if =;w;`r7G6_߅6EB.@Z8"[$H"Iqo?VϚtdbϻ}b{Rj|t5-GˉI<,;#!I+0ܘv$b4dI@9/1.W%k6%k@qp[y/F jzђNX*tFN8)y_t35>GL4ǯܻI.F}ߺ>륓-hN$%qL* Atoȗ3źd^O+AYi%sVYKYVh*?a_q#y),? oV|ɓ2Wo&0n`,wʝAԹqz?s9 k=RFj~XH~Ks YPh\'ICF+([W9~CUP/X4H ]bՉ_[e  \&'uK'ՖI5%1&@#4M%Se>m,(rI諭hOi门{2}bH&'r˝#,+'{`Rͥzl?J7[Rn* :®*z.,MA׳]Xc(AU( =%BS<27wLTF f,:K2|,F*)Z%ZNJ&e͏LF] ^$F* %d,9doHqqh= $Hfj6>jiU"uG}.Y_2uּ>xM3!rU3:_۝}E'2-amџIoxB~ȼOmJbsDloe.p }e ! WB`Oq+1BAny%ב[ "w7Z[ˍ}Cr7ioN,18\SfL/JF8W;ݫSMTe8S\=4BtV!'6:MFexMdizуc#g\Z&"FQG,`#`8;(  !tpT_7ꢦP?JȎȭHXAA8LFH>^pN@2 Ƥ^=~鎣= D6zZWi_WUSXRrj KdV[ °̰-˦+bQW&AT%Oh e{:^6$Y_dVd e^)`ɷtisDNI(V_a?)j*_m(45$k ިlydf{br3[-v=X$p)]dj #X(VL9WD2p|DE39i@/4̚1I!VmY-Jpe3p'+r~t A*5My,xҥ&Gj"57yS=%bb?!ؿ,z?](f\ )!ӓŏc⇑* mJ;k>~gEXyIMkI+cX{ i^ڐl8Z$pk5hwj5wҕws JQjD'1ZPo?+e me0jcOG~aDR"UU)\ =$'0$2^g Oag^b'73!@ǿ C>9'egO-lOa{&H~S˗5'\YFTUh6Gni2t{9Ev @IRvE#]ͬL\sƧ>pTM+>@_W}K Ҍn\&q.b ]Y__DcwY|mUcU\JN%I;v*Txݩk>ZxY.<[E_)YC%-M.ݤ`XSQ8?|Dm_+4Nw`WjZɋ=$yB]ZgCͅ[^$i2 {hh3kx>Ðy'd[''REo5q6⤝ *U n]Hy"{lg %4Vn2VPKzi%)(uLN.O(QWdTazڋ/9a!= Cmcq \9=aIm]/\mME; gh-QhMҫkpVq&y<1YΔ[WQSͻMɛ̃6x%8zo5!Nd(3o~* Us22s Xo ECd/jYyy]A{ks00h6ySS8r۝1jEyy =U.(Kܱc*&Eb¼ܤۯdmZf=%<>bwbRhNτ˼]\UָWJ uЦV+ cXdkϝA7G[I ƿ%nJސN+}\usi t-D^MO <=/zߟ=AlMܼaQ"nCf B`ِ񘰉֫+: = Ŝ544hQB5gNey (:/ŭM,aT@RXCoPd?? i]"~hc4;|Y"o$wsݎd'&+`^cݖ5*N@YZ:~#82U4([mпĬ^=W]t}A^\;ǝ{.} EH~ Vni:ITz=͊+Gci15_}< bP5C`X!'/Z={.We:RD p:HB#jQ=D;Mχ EB fsU$MT.@yCt))I^[UzYDQ."*%Y Dpn4i2Gh~e͊ʩ߅C!ӕ6~w^+I5!~ *v"FXռm-8R\cf)tk{Onw畕|R!v<ϥ-j**[ v\9>] @dKݪD? ܵWmfVUǴ;",gmK3$$ w^P*fܳ]}}R8mDE{`qTC{bi'j*swCǁL؄aPX4  Ȧv`qQ/j ]EYomF#ݝ%:RGZwI^uڨWLfU7J\f7ۈg\фEfb夠5Fm׷[MUj -= dwy6,䀔T8aP XJrGhw{mKӲ ~zH>UXY UYsUcc]"}\mL/ȗxH;yzzu٘o`} 2l}$ɰC㽑OoͶӝUj-K2ȇq$~rFpFYeYdbA$fS1 I 5̹VCy,b0AAAfh/2Ab1LU+hUd3bE@(5×npB\M^hWoMբ־j[WMAwxIL>h B ,AJkeKIjb 4#+&.cm-hQ|TȤR)ExXX8Hf}Z (0+D 씘Ap8<8ûd1T*ٙ39bm%{+YqFۑ3t0-(Ls8H;Rz(/.7 1=,vES⟱:o}+uʩ$ܦ{d?Jo0FH'dZ"B;ݵ"ޒw,Y:wFE[zqT5V-1}jUKJl{! J8տ F#SuXb7࿛?' ߾ CuH "gbLVOx1?ht(8U-:OXPޝDS0~<iW#]lٝra4*#~xFtBMK Ew n,A(l7AmGrAe\}<<,_GIGkfWr͢Ocvy;{v.^/uK r'eaYb,e}QSD8(6O# ⸮*h{ıd4L,P&_;6WSE5(yX+ UA_XdPh<K,f(>RٱJ 4Sw$3Qфsvt٧;М#U+UW9,>9l(.dTr;2K:Z;h;%!V3$m 6cO"I(t_;@Wq!9 l = 4% pL\c,3r,2F,c&KY%6\V3+(miIVe92VQYpE1`}{׌J>kKt>c]kBaJմUXUX]\e:4Α(4kѠF/^)d!e/,؅piMy#&i2Y 5$)a"/LFNl SR {5Hn>⑽>֜+DڕOy1$_4SGc:2[觐 Kf8i9]Q`GjF[4⇺-'m؍v}lcV)@w9umSe? Fb̹Wbbp>\hmF,. (4ۈ Β"Xoegyʜhu ?XqR78.yRx%2{F]%ҴuQwQ,5MucƗ^3J"j 'NÛ&TC!X N㝯y\!V-g3X'jH6o)6)qE RŢ`gyS 0?AK!Q<Km0y0S*IU(e! 5uy]͘tm" u[Ҩb%2Pw2ˇsJh© HEّ Β"ٲ˟5FR˵% z79WF #%3#%]hb< ak4ٝEusJԬ28_laJ:uI xĎ"wCOZ ,;RA|Nq^\ (jF-_׵s8@<1 ^! 1jXռ;ۆ9PXJ F-1 eh砞`)yy]͘tm" ([Ҩb%2ߑmùX޴ivTUQ\-9+WHE"HR)/{u*zX20`"NLA3s5MATm$SFP\Y @m5i"/D,"rrjO]ή,c2eNj{ZĵU\ٺ+t%cR+tz m1&$\.藴W)䖺olweOPL=υtenFv>@NU &'B;]&j[D(=uCabX%bX%!!!׼"T\܏>!%׮d X 4 r4D"C.R#xgBDwEb䤝^o^DxU,'PّD3IЍEqD%ˬsuwb]TIKvK|{{kwfe:%gEiGQmŒs4՟[R*bWSb9%&vŸ_.`w:TR)Elr-IS3PS3 _dMƏ&,$ +,dm}t~Z"i7HOzS2XRw/&&;eq iZҁ|v&D #wɊC5ԑք0ԇ*xn.H2]Yv-Mf4x1'3XOޑzKZ{엷[ 7OD,Q4Htˎ#i|6f4z0F1>H@ #H4#BYHR)G&|rE_V6LD&d|V b,`TB/*[pa(25v>$Q:Y|ҮoN<woIdMi0-GJ!Рƃ h2id0<_urw U3p;z*p[>EŞCaM$j'sOzl Mڟ}>nw8*2.Q+$& IL(9r2c7Js]7n"idʗm,4qZ فvwiEO晦3KJ"󲖋ǎ4qYtYzKXR!9Urs-J̉Dj54覙`Z$cE&u=Q>¼̕{I#8x!!^ #^J,]T8}Ν0BaAH ~:+;׋DjvG5ŸoĒyE!(9 | 5Ϥ)g]4jԏ:.*o-KVN"yzEϵ^p1mQ4C Q'W47_[fxU0ՎA*~#D|󤾳<ȃѫ J5(֫bEGcќ;]vM(/肨%\/\{S#( m*9N]5~k ezC'2|I:X5^qjRGMmj^?jmCs?I~KFdRjz؆ښI-vll]~/i?@]Aݨ*%5m/֗M_^_+Z=\O/6-rN"2ntLCPYbH矾&jr" 2Fzx\^C:D'u'qgL;m5XK.e#goofy;>V+W*RJhkN3`Q}65}'tS~S mV pUKFV2|Zڮ깛_wE/NٕSz 6{M~ۚ"+[ֳ|{MsEW;v;ե Oceܡ˶Z"f=S]1@KRDnW?oWs_=n˖m:`i3)\B&$DZU5|sꒅ%^AF, rsGf?T-s)W0ʑѺ:G,F|kV:hR{)'ml3}HИ]]eܡ˶Z"vnc0U@KRDn]s%~K_=n˹kvӦ :)\B&$DZcZӰAϪJ{ eFg"!dDi3ǃȌ#1Z Hm7wyԟ\*Q$ ǪZ4r2ΘND-a<2:V1ʎ)ˇJ.u*K+Y ~oWцc1gN!4Ј=d6cv}v扻7 B ;Gkw]ANI1]X~w!b\i]vr?T@g;Jjn{|9<p0ׄh9/@f̌Jזc (u QU@06]Tc]]bɷp̺Kɋ6gjj* *);ζ1^^[C }e&{^26HYnKR.nS+b0Rm ǬU^)6MRAݥ\ӯN]HQL68b;<+pz!' ?ֿ٦ŲvҊN 􂩭)CȘ,d-2@ر鶡2p]H^GmN_7tDe[newMmPC3|o.{?!6 gͻB}/7\$N뷏Z"qT6rULtvS֥yʂ9Z~rnƗƱvAUȫ;.GGBKTF/hq9DF(~+$eu;ەC#ƚҴOrb07$Xɨz$`Õ=g4 MW$GhЫE]P}CO1E]Vk:Unb*]XLLWw_e0'3\ v\V!doR`v5sz KV*R1X6UC n"k3AA" 5xcͼ)7[i'x>rҎ'`6!%x~O+Oxuㄘz! bry^7USpI\ڐN:PܐY"ݠ| ΘrXonnB!beAx~$@A*y6L4n3S].VTngR4b˕Nw)Y#Ԭbf'CAc8 PƄ(!s,83/-xh 4- ,U:fI^O}Uv[;z W7)ޗ֙]$C"ho{+&ϐo (,PLlz]~e1YQe첽d^!(>Ǐ2 ) fnʘ]o[qHw:.ש.,f@TW㋈B-}GW:(D-ܸƤ5Cm $m8z,c3X}N5o)Uq˘]O?xl̡r}{;ZP_L+vˣڻWVuS%{xָ\IeT-$M?瞆ٳ{[z/\<"J# oZU]:B{*/IRw!K".].z\,ۄDEQ}mC/cB#%c3\H2 Vh8\ =ezjZꄏ^FR1H ӳk: L%PQM=:`j!@垿ɈyKIDF *lR&8Pu,p-D8>:V1v5J=d)}Jx>_5tu[v^,ICUd/RmڛqDª+*Τo ^ASuSrQؿ[,Ft5I|~7Wke^KX<_ޤn[yLGi>W#ҏKkY6ic(GW*c_!ib;ud]<]켪8 ;HOR2JL )Ul.~v$o%Q krY5֌BD`xt'^)xCP+f:YpN VbBUvIF2]EO[;)Viv[ RDU#43e` hKRd~ٲeI_6GigTvcbݷ%=rVnv^kv9Y-G[uS-\q7'ʫTڂ䫥!XU߭iX|*g v]O-l&ҨR8f3@quPGO#N7dċ^?&)^i`r˔޽]Ҳ dј:HND0jɗ+#<@+. c4LHAʣ"dR>0HKtce+,췿$ hfCYxS/bflB]2'͐7/,$ NQ?{Hwk=o+0i+6{j[ Vg؛ijkQ>U]ߦK%]/zōgڬ~^GJJǻP8t@g;@`2b~Sh|UKg6t)3z< nYJ!/?ϭܹ";vM HX/t~)E\5xwy P׻%5֌BD`xt'^C!K-YX/GڪTJ%"Uv$c%TѺuL;)Viv[ߒ\y3!epԲgflB]2'͐8q 򤯊 NQ?{Hwk=o0nےi+6{j[ ͏ZVg؛ijkQ5ߦK%]/zōgڱۯQe?w(Ktgwzcɕx~_I#O5ёnKIrZ包yIN:W,4Oɨl<Ǜ`vd\5jeo@-Xz'IDN{!*!vsWʂinVChmt/nv}VƵ}II?eX^]Yly*iYSF՟I=W{Eva # GTus~oyז(#&m͞MZsyIv6DQ0eU#ҿÓcRAۓ,D:/[9z,1#IWh#gIF,%)vO~ R``!^_xQĄ,:ƪb+{CX`)IZ "RI l(BnFPqƨ18M~"tR*Ak_/#ggaIOF[PsfxX?Su_:$ n̖ Slˍ%yI;5K ڑFL9'Zv)r2}:^͙SXՒm|[! *!M0EwΞ -iNc u1Q7Fwb#i\SGyf$'.vvїƹb+ ppJ@ o`*}Rd<=WH~aΔ)O:N~Q d@:9Taǥ!hl.*||t\|\&tAIcx̡}w9K!h!V=į/Zn_V˅b+}Iߔm Zvwɛe+3Q^,߅~KӦNkgNFXm[SvدyԶ35F!Oo̦}"YSڋY⶘y{vU:K r~xT5;^AaqygM9V,]b2vYY[5)*V%4!CXy:٭w=B$S.6s-!U=~NW fO]|NWv 'y]G ɄǞ茮 Mm QL҄83o'w_q~ƶKjg (,źёi1 V.a/vK㶘+NU?LIjpbqNZ9 5ceϔt|4pkj'RtUh``ˮC2* lDzO ș*eñb(kqE;] HaX*Lh3mܩs2?$gW{ S(w?̦fMeKŰ[6}7TlYEJO3 14yUi׿&j0//5 mkb=EQQQ]11Ri'vХxO^]y)[SbJfh2|!܌?ee1:L:y+//7_:uEWputs^tE"fh2dWceäw 'QŒa"ZԜ W'C UuWRZL')xw~K#WjoL k,=Ez M t$Yxio`^\YUK*$ LtLtLQDTEDTEDTEeX]⯨V|7YFmy/r%3o> ÐFu 1W{*s^_"ntkދ\g1yS艘b/Z f0<vYPa&tYegYG@ulkkpzbh3!Uj;3^Ji33[E.h^Z{4XͪquSU'^'^E0[r;UPReD鎘(KR#q Q&)+sȔ;d3C~jz'"5둗D`פpRe1c'7ܔ-"š_dVaM<2a?=|`]x2k6yv A&Yh4l1W"jӟӚ,./tʃAPQ[R}KS4Ci N\b\FdJpr4'QIj$N@v` r==}9'V.YF d@:di5:N*Д=g!c!90D?c4<)v/,;3Ȥa"5#DM E/l•<\E nB' RDy*0.&Oiq{q)yKMCj”:3UĚN])!EJ=1- "ܗ?᫸ 5&7t^4M qB@* b4#Hr,,Xf'fVg3n"KǽW^=bf#@ q®" e'EN бh4,,4#Hx: H M^q?ӄzZ3a|L)` ^B.4a0i7Y˄( RP]|Ikš$Oq ~}9m\UeleeN}a^$03Bo904WgY!0|P~u}Bྴ.jnȧm1UR2M Y1*fd\ X:Ң|nRجnLNCHB!Jx0pP:JT!e62>G< pőjIYoLPNGg?Y˴#)w is1643[s-%#.+(cOuWo? Z/[19iaJv?81zU.ֻWZ-/$UZ=PcX'{vNJY3+cFQj5 \Wq]eؠxQ~υ'q< cHpJ!Ja:ȏ~=,tBi4G[bY8^p%8>T1"|\<9!1,S +[6:F1S\?NkIO,\:0_|>*2d.˄u[~Oy1]\g-1ށZDj%b {YhxK3~&+myfA 0 ˌ` I|4*/~z`ױLP. Eٝ:$#eJoPc.lU,zii'fXӪt̸IAQq G%c&WlɼLcd("#~B郝ni{v4+;[Q<"R>4ywU՘m.r:5̚iheL[VEpog74 B]IoKm˹=V&{F؎EQºfPZX^wkƽrs?HBuY5|Fd~GIuǖydê (pudb#̩Q5 le͙JxS*ҝ43.P{\GL%c&Wlɼf i<>_`fp6<76Qv:DŽ]Gڦ-,@5؍GVPk5-9̩j4݀u~&恁tC\+ڒA~M]Tזw'Oh[(<u11Fl 2i$I$D CkW:"lqxj@C>Ջqg f P"<yV8gRL9C&_,WHZ9E`kN3K`}ƯSނF%4. ~ 3pJCB[zpIBAiO#9֟ҘUrn5jmY*G03Ĺ4̦(68.#.KZ7 rJ윜JE"8ijQR!YT@p I6W^ R/kKUԖ+ke؈vxړ1w@zm_.#5HL,9X.M,9y= 8 PMXލ(FG:_Ew ?RN S~:jWEW],\mhV*c(nB;-҄&F{P[ȧEJZ3곿 m9(  B9,gVWI8H3 l[aY޳>֨iCqT#U]_B@Q%I\HIκYwHhu+l`i\'KٷpX؉|q+1`DVI7 .{6-0i6$&[ЯXIj(֕b I4{ꥺ)M#ޙfӌ,qQ9#@@"SK= POm!#dVLg>wdUaA;^@-a򒵍mW1j7̉NO%zNm&YX~k%:9WzJ%oXTB,]CN{gx}9QJolFnߝJRHެg޻;۟#o/eYykWqݺhɴ1IP^VǛS{jwD[Ho_a !7<QJ"(g \S[HŨPbUp#CXL؆f"' w+0:Dӕ]p׌HMmF$Q[BMOs>;* ligyIZƶ)!>c&fc!8!O|37A,?5k_%ne-Fŀ\6G63`ʨ 7S#7yShwvV_)f$oVNR3{o\Y÷X}zY],֊n-m&9L|Re*tBrձ}R+m9tObFdU҈*"o|m"զ).y1ainwy9!I^ۮ NsW31 GEhM~:" (Fk w$+nWE,'f.-ndLPzrKpByFۈ%[Mp |zJ%oX̢@1ce"XN{gx}ÙU&d`f2ߝJK,܄^Fc޻;۟#vZ[_d*1ۦlINzIPa\ly>*_GjwDjJvF">}R bum'6sqYo;* l␌9hX]Y3H\I {n Vnx5_=(7ic2ō`q,ba9 0AeTRزC;~u+l/r7r߳zn|kc1e^U=o'x&RBrձY(R+m/H.J4.ESMoEmǫLRfE5:,2slC3KJS)ݷMPHAn lv(h_ &M<8ld+' [!%&kÓ=jqPq7$y/>l|k+}%ޯBuT}bO1o[&jӡ^@|Y}-Eҽx-Y[zYY~g*mXadYeCXuWѼJ=r [{}vY>m(:nݧTR:fhϬ)-7\ęPҖTPhL1].c_c+!͙.[tk|x) %BXV*LDPSYq\3V!!&S@ȽQC^s:C~g a!7?S{[<~>)U62I/e׷Uso%é٭n_;p{@l׉HJ>vu$&>Ȏ÷ml]bb|"4Sh @iɮFf^u$> >% U& Ujl$nPjֹb#"GI%uiV$d50_9^ܗOT!R#BfMV*ȟůe4\U:g T]2=ҊZ|O(\Kp6Y/yTs_"\oDRb W q\t_SsЋIqK~ $dg1lɳ|(8'*8#˚d%9,%ZژjRڥnήQtؿ:m2$/ΙYվ{{j7V%5*x]B2|$ E-TN*|ѪO~}GTvǔioC*פWmd(1>wW(:3"Yȳ(.M68+uBIR4lB\uD|@!U)9)Lڅ7śYtxL3y:n;L\[EΔ>89í}z,E.g 9S\ShʴTl5t΢wNدi_bR?֒v|-rI:{}LL(8ti[}0Kpd&Z;;J.ru򂔙 MM}CgxhG4fX9 ""I_o4ƒoy3} lfG >ʲ?Z)jf@Ơͩw) 荻j*dr8l<"Oѱ/Ɗu.KVkz./7UŀnRW1]*, ,XFʄg\%{|ceH)"C"ڳ9e>ߩE$==U %#(ў`:XUzB`?ZJ{R^U.-ٟDɺ zljNqoT\^Z諏c}d;^}?-UzY;ZbFX˳KV+BְǦx,x&\{zo~m ޷|.䧗=9`$8I-d_YTlo}s(NhSO:cH3jGz,"ЂȫUi :'X!q9j:=ononSa A*v'KTM"TA5k]R/ @Rr>e?/h ` Ezqbc&}aٲv9hz~գfx?DU*G\3mPUkJ:ƻ̍(KiBܵ"t]ک|`,=36/{|:N*|JuY7Vzp[Yw 9}0M+Qz.L yUGItIw!]W/ۇ n=uW?$( u^7!2A =3y5KŻ%ZX L9(F֪ RS x=<Ĝld,(,5w|ÍuX>-f"P&p#\`7Q`tYb)E%}&uRθ^?%@EpxH|.ixNctMa*?0C=~_?v?9.huĕAo\P NLrOȏ子ZK[;! kDZDwnēlQ)֚ttRU~j>Ӎ6YxlG$mZ/G Ŵ80O%/BUaƸyGVn d'<BG痬~ {,R#LR-`rTnh} f #PG L)%EǴ9a&P zP8@Ȥ5)6(5lY ]˺vų(▵ B#\+jR*>uGOV5M[Ca^,Mr:z'cTTt" mYyǍ>}!w^԰kwNgH<أ5:ʥ0/"),Ն~GFh+LJUl]CLC;dU[ \~i . /dmtjɼ$~]9}␬.AQ&,Jҿ{aU\طu_7꒨ osֲۗ`%nwsd E#bjBqE7Q=,}SlY lNl5M.#S~'|ڷB,D53y"cG""@y%{GHB (Tm]W}ԓpPEۭo|ޝ*{ }/U$+ޓRgi̮܍h)1bE#a+X\c'ly.V zF WM(U\D55!8J\s)jkjg f0 J F”RBs8n',vZ[؟ʳek@idiHx _6 ̒JHfY/윴z5 \_HL2,ݕrr7=IU9 ^;ˎzPIjgf"8Y^ ΤEJP[kM*B+Ɂs盽ɄyMՌ@(Ӛ8׫orȩ7߼+C0{HIx&_涂F=S\TyN6ʷ2ve]!ҫlg)S"ir*K?'-j=biDhOdW[s>FW ҪsE@Ewm]"Ijgf"8Y^ y&9*ƐKq@n%1JIoF#:#_)q_쯆X\Oc7F!4!N5a)@W o37Leb}HafM]m Uڈ{j猹Ŕ+6jioXe޺! Y]+lg)T4f[RhϘrj=biMF[Vqi |nv1A4NS*,0-EǮ KVk;17rgdjJD"pƺ LdүR[ѥE%\;_)q^MpWЃ uU qW}+2>0{HIx&]kh*mD=S\iG4Gʷ2vebeJt~jT=M1WQtqICrj=bׅcrKbQ%aj6i{`*0TXdEwm]H!Gکv1p'G?x!W(vM&4B-P[kM*hJe%ҧG&Ϡcn1.J&oq 5y}+iDBkv%( jwѕ!BKks[AVSj!2OX̸ _,NٗtBg4Z޺g)ScUРFQj+3@d!<*sSP,Œ"±vu/p}A8UE*Z%i{(.j>HRVs ;ϳOyKvU<,S 41DIYf&be IKȸQr(T Y/"^\SCؤZV0Dſjow=p"zZۑiUdU)?=VTмӚ%/ K [#hAR-Um  7'=FT%sHyky5 2]0/WHu3(D}CMLAY"㢺(f j5p!Z?V eCŒʷ֋v$9' Fֳ J9ְz?9[z;BkZǵ T0 Tas=Y)rKvxS Ж_ Qm+ }03f_+VhHf XPm8Qu]0&An:DYo9.[râ|5[*I0QvDFj9Z1K%/X豮'Bs9,KrVc֏9?}^+!SjhcNʁM -D]˻7Mg~Uݺ]Pbcu3fvjԠJaj^\+,rkYҪ2]X-4Vɩs5 (N*TYSUumlJ6*R;djkDVV?yd[=-aVA5܀ d!&Ud,D; el3S.1JŘoo' j 4TI hKkG4}&*q=}V4Ƶ/P^39Y?DKz7G=PW5.Ի~vohА߯~b~}Ix(dlg\MCH"_5<`LDDDD!B  ~j|-|U$t P|z?=^bqT)-DMn~0נI4AGhN|%jg@@m~TUmOgl1#"X+G@u|o-W؁_8xp8ȆqpQ=!G7 bWMN^_;A?-9}68{T}96QֲZ/xz*5$)##q5[PAȁ3J),!j֗+kR'~ 5[p$ QnLkL%ty2!Y$݁SsrcmoPq.^:}->d~~ 1 <Hsp^r<~D(t#UХTfLjJvh4[whUfBd~lwf:~J ץn;+(Vl)05dEV@5Y5Y5Y5avj4 CυC>QL fi T5@ٵ"^~1w^PH"gv ŠM()7$iz1uR:? M?>:(Kԋ(-l n $tGXOieQm@ޤjq}G.z:(i5:&V~!\.U|!ԧ['Y4ʪ´Qп_#BҀtϦg#09K=ӑi+ڈA\Y aHtQDHmPjbApx ( 0ҒV^tvm0TEUBJ-.cf!2HSFʭSG+Gхr[)ӏU,ζP-m*f\{PkNLWv+R jEm2k6I'ɣuLTMOڳ{S5ޝ-'2r>O;+]!|fE1?q#s9F }9 nZH;sT5$蕳P($6(}_ \R8KU]5$ԁ]yYjD߅AL-}Qfqm*В 0zkx\=#QOThM5MhvidNu_zVDҖ)Tƀ2ڃZpc+#ZukR(n< LjI'ɣuLT57=YmI '2#?xfEQr;- BH'PHԱa%'d3CdtI#n*iƢSV5)B-l3j08->0ū N?0wٍRs7bq"E*CpςDJ럭L2 SȤR)EZTGVIDx4Z'Bg.A~>ƞ0g)q]Mv<"5.^21n5hFY I5pkw#ۛ-N40Ik0IMSdPK):4~=i[2U AAVgoFH ٲ{UU#U3V2VUvzD}/V3d\GwYpH.,ݾ'{r˟G 22JO[LInDt>)àw  y}tߓtIK}(l)ګ-z^m 6e/\~OORv2U72?e\ͪڮØX8Hśy7||]ǡ?rpok ˴{v&ݿ*Z"PnSP.UZ~]j6j2(Ү*hUբKQ}kqu#(Uh+\J9#l%_[ ;uv!sR_Ud" 6d/cS$ևiLБU\Gq.Մو;EV.ˀzSFpYBރ ʣw9E?_{V:~~TGla5]%NjYѶ6 * [-QG:VW:=M|sV+ʚsu9g y{Mw@=]c ,Z"T/[˙2"{utbWw S>瞪DK>9M]kBQsN$%'NŰ'e~;YvI#Kz^w5e d6MSa&mOm{.U[Vj^_;mzݮ:H4r\(Z$UʣW?;N&}9څg:|T(*/G_ jQ^&mO͹o;.U[Vj^_ݮ:H4%2I]ʣW?;Ng9څg7/J$)-E] ԟM赔om*f&b_E" *K%DOYЦ/ߢ'葀wLY%J-;sP `F;nR^5M[.f*h :\us7.ltfwB$gODτ2'wR\v{*= i6Nw*"UҖ2)Jȳ ZQsDjuPH{vށ(#KBv2Or"c}W~(?4}%o6TUn,& Xavܫ8^i8q$[LʷE|5.d@B6"ULgE^ޱ)墠T0|n[բQ^MQ[a(ԇ+r׊TnMENReec"~ Q=9KB.;_#v;9ۘ;9BnpՎXq[:)dWj~žg 3\qo(كVS<7KjE:!ݵu""iԫ_VK>J+Iu;XЗ-Xjh 9%yAb y+*".p{ȟ[2T_," 7FnieDou?G jM!(2c",xs-K #^U*`X)R'?4ߋSYqptZ2 3' ϧQZm~EGhr~']?ˏ5;7N$-#\aPf~y^y̕kBAhw0R&$CU]0μk*3k*nalvTNU+7K1I,G}~Vh{˙e`Nhf8E6Ю%CV=b }U4] q6H5J.\]30 U2h68?(FV&~ `kKG| 볅n(tI4dY[DKN/i]}&-inf1$eŖ5˟:Ê[qHi&4-20o> F= 8Z/%\?m=Xݹߢ/-k,TQGJ/=guPP%iu/W{sx&b Uk^%YNAX4œF1WBQIA FDFU )Ի?o7,iDZ%v2?eb"]]k{n,eћWBա}UbP^J6ն̾ߪ'9Կb$_.)q}K%͖AبRFۢTgh1RiҎSV[]ϕ,#qW%9tEYHMFC;_;)S!PÛɑb٫zA] ;5n 6Xx(4l8e9~ˑguCɼsnĭ6_ 3hP9M3o)4ڔ}1JlG~P# ١/<[clnꐜC{uӭVgzɻV>ά6=LR>-= CPLhb}7t8[|'"^s`kDIjL,~.#yLC+&˾v&ߴ^׹sʽ50`ۺݣ~gM=>AҶvqy+3:Բh\q.~ ^;ݘ+r-hF9S))8 zrU&-=}G`kprG~t|c(qbvR8klVe7TݣĖ'̅"Jޣ xt|mJ{>~|\#b>l I\nbgww$nHNE޽V;m;O; g+Qko)FK,׭hi2mDݎfHM 2w[RoҟА ~gоK wUSww9o2R%=2}<,a:%{ӶA C-Ƒ %Q^"4w7,GRmM=U83CRTIcUPC>1D̷sHp~ⓛE n$f/ v}C-hkCQ_`߄ܩz:}Ymͺ~d;9f1e4y_Y5c5MM{j|{ruF?#P%)$#AJgR[ý5:Lf &@}޶g6%bXz7! #݂b2a̦c_H @3wecj2u@c3C=ŬaԓMZe 6X'drhqgB 5?j>SR(etsThP iUFT٫3(v߿NVu#FjE)4c8Jȅh/}۪;aCu FԬd -hJaj*+)E1D8g(o!2p K@U-78B`IQ#B'`<ı(sᣜ8 vtE:T w1e ¼LZ|(?Mػc07>9ku~a3iʹ4aVjDŠ/%6B?ׁJF 5Аr;T },OnvpB3ե5ܮA-"X^xׂdIh]RuğebJ:ĹƢ<14d<E/%첥ydD_PC1u <Ċ Oa_kN1IJp>v3B3t2-l0E,ŐETR˙{GMuoԶx̲ 4bY qoHQEWYW2W>ngg;3ե5ܮA*ۿ5X^xׂ)(ZTq'u `9TO~n~ABIN7~XE/  'TD4C7"1Υ^y+RRI,=u+iݟ))RΞ|@1= Z&1<>'̴yZ04qAQK.dR)5ս-!2$qCegG gEEuy >%rnvpC9JZSUܮA-#Ux)A\Kd'HjRNO@@d-y^-.A7+&:Pm1([o:SAސ b^yk2W>nvpC9Jե5ܮA-#UxRd'HFRNO@@d*~n~b\4;EzDe\e\e^t pWJBv&;nP2T8I\VZ q,*c2ȡ ;_ɭZ].WբRh[6v$0Y7*8xa n,ofsQGX6n{%kc7 8Y RK1 [ަ1M{%{NIi"ef#D7dX태b;G)" "aL+J7I(u:ug!4"V+hlު=.*ҥsQ(XݤRr-u$bX]E9:Uvv|_E!O؄/E%v)ͥ;5{)a, 6G|I6V ?t+ 57Q*r{1S Ql{)heDR$%$CsIaTH[BjMȗ 4Q9J|bfF2B.ʲ6ԕjʀAUԣ BC8T<[5HGgB LڳF 1SZٌ2I3Y(iFm v:6_2xO4FfoI˔B@cq-tsm>>:J *Z]e~z Dj[p!֌!m>IuEg>YFHP t:BVHh?2ECO b=9>I &\=Կ?7(x~_< \4L0-󻴒[R.?vlF: y_z=BRR+fBF5M`c-faeCUs߁&Vrޗ4K=x/JW >HNP$/Tga^vjjeNYDXߓS&.2o6Au̷AHk֏u"4ck/ _GUxy:f>粸ֽgB!"b )NlXrE%:~r_7Pmhu[y"wcYdYaOҞ'_eA:vVb UF {Y F-椻X. A)__~T 2NҬ))ZbuMK~W~V]Ր; *h( `I>4UR02ië M@ oʵOz40!WL-[T-]5!( N}Ŭe)8~+O]d*6hw!&:0S#IEU!2iëĂNUPO|{SPLjžF%n@'Sgb)kʙ$MU-TڦiMm(kwuA%$]@m(/6Xy(RVm.V3!;kifqS(qWq2dqfK!K-W;d5C Ot0ѹzZf\)8~7SyO)5tB4 ;tbTEa|IhUR02iëĂNUPO|{sP 2@JS-G. EN?s!$*Z'ЫAm"V3K&P䴓\s -^&C. ToTVxշjsɽ%b#EW4Y%Nfzl 㪄1hjɬk۫*YK-5$t/E&kjx~$JhًnpꀗYL7mu[fXX77 썯rє#ؚq|E5Cĝ͚:5/ 9E&£M5epmo kyz"hCX$'z;<O,&@;&Jku}_dޯK-S*Qlp>lݛ;K0pUG&\] zWmi7cЇId.m1C$A HDD*z] Iu bB0 O*t$xƕ ڞ.(e)C*YMr"APXXZ!㍦p4hd jTdjԩ9\Jo eV8OSf`hJvx# JB,gCGY8Do\$a5nuNaNx,&!&oVF{U+Um"Z9]e^2Fc^λ"ԩ'2aҖ&(l/hC,gƗGXWS"j% \"@hk|Ԉ*6n#9mbaBZ $y;Xy*5׫ -Wyy!%Dq7 q&X/Y/6l!/,dTbtK_+%Ȋm *O{qS=; x, EdiLK 7t!1;|vANW2+kfT2Eǡ5^s:>xJY_:oa۱Qio6s)mĺ"l PV^3HO~g^oRؘx$0!TL- w涫<<#,ϒϙ$Ai$[вf2HZ; +=/1)t5JBJ,@tz\_T#s3(qPճo++GV瑩*j|wf )0Yۙ}r_ۛtӳN{Ӛ(P0ex…(Lt5n85IP/9߇*]XDҒU!S_4x%ھ(]l@J%!VS:\f}Tסޠ4ghZkܡyk MZ() +c5b j&2K.w6ߴ$4r&ԪMh@Kh@5Syjn]Ӓ=SM.D'U'};!5Ἐ" !\W[lg;3}*%,,OX~3 7${=h u9pR@ver熹M^HsAЃn=D~)tʸ17hpb-WB\(ΔIN 7^r/Ejmv "}9zɸкդSϙ*UF>` 5~[\6E\b ҵ~k[ sO\JBl$pXU%D y(mP.frMFR.aC.8iR:1@i-5Mq /Wr Gu ĜԘթKV+1/1!6N2|R%惥muM1WUJ!DzpiN"\Z4ijgJ_Q9KRc5ԯMdX//R_7V#OVQCJ}XMkߧi6:th4RنhC:VooK<\-W5344cJR$:*9(&JQ]BL߮IR(dbqhꆂ5VH46pL|M~U*@&srIk.f| ҟҧSs g9KRgεKky2<m0u)Iۉ܋T}<k^ӊy͝cZk2 kp?'V1, sO\JBfLK)H`|䠡Ejt] 3~&)Hs t}ţ|LbKL /WrnD@NĜԘԪ ,cez_$#vz>&m @dR0jD\t ۡ2czܹdJ[rA5SWnPӕ܁pX4@(w/ҀP^6y+:lGT\@CpSHXfr)9*cR$xEgѷ2FT6{v )&i@X9aCRsoZR9EX #RKQ%n T!#o|_Ԋ?PG:[-HxF5ШīPo._l*5 rogd"@ש6pԥh`MMS9Z?#D"R mI5Mi]ٖ;|X 3GFGƥ?.Ոru9%"'& B$M ؒ35n#V/ [BIDu, S$Tr6EҼ'kz;V]SP ]Oȃ lF9%fMw;MRFIgl]nlv%ڱһj&hf7~R(D*;Uvr_]$LbBf`NO~qp[x7JM5IOˤ&qKҰI PzN= 4hxF#T\<;g/@PF>X iQB<[OMn̕KI†Ԑa 'Aw̨Opߦ_|zD|&Dlb0IgBh-6T҃84R [*1|"H-Lb, u^< Ne."Hs.bNˠO m$(-S*@@1 O"i5jK#=T y ,}\2)uSPtS hIc̅Kh+??????????????????????`OOrYklKı,Kĭ=6fAՒtk4Zvh-@>-s$i(&+DI}Bq g7u93>ty<u_۽"\/XfXT6H;ɥV.{hO'B:,޸)Q0 /eltOU:nV5L+9HXCBAdϔ0U^ڈX6e%uVu>jihvU{FR԰_«7LC݈LaNʊHFz D)B%"Iיcw5epE{d<C^ԄTrȴDjo{.Co>t䅏aci6XL۲ҡ &q'u!ꅇRܫijU7Ǖky}L,R:" mY1b{;>>qyaֶc]{UME'eR_w>$vK7?5ԵtuE)xD`E*(T7fI .^ zB{[5ʻ&B dm|7dT:E19loJP3X7C[ɇ܂ |12 %t@5u C!ZX IO &/,`r Xc:I8RdVd[W:=iQN|m+iؠdϛ Ws>*m-1=.Z:\YQ۩.<ߜQ⹋GcVؑPDB.5E*~rp _kS=ߝq&U2S*UI+`7HMO-E \o*r-`hA~PC[|`*UYH <#j w~Q_/U+0(!Z= _;1I8RLoJs)Qtr[-o݋isŭm%eOGʛjLOzغKĖ?jokjnNcmڗo(\#lH\!Pޗm-TҾz,pS=ߝq&U2H2UI+`7HEQiRj1dxh AÙyuXN QN'@f/tb ɺ'j w~Q_/U+0(M)_af<{ŌAopPtp*lK}jt{%6lݺO bZ,) g͍凋Z$wV6iYuTω-.~߬FzVnNcmڗSh'QdBX2b|j"Q9# aMd(Dћc¤an o 'lʹB4Y3t`H(w./-ҀLR 5[Xj'E vXA'؃ݏ9k;wv&Vֲ~[mdćt t̽,ln*-3!m!h=puJܩcl1jXUk9˛`o&vS#&@`4-W//;E$)N[ |hZEŕ~I5M()KEAs=% ;q;/S>|ܰ߼>KWAiȈ|5OD}7CIZn[Unb+(Oy)[Xe3Z/%4Ɯ#M2I om{íFI+%/}=7)}q]Cat+5W^y\fKd$_ Sގd)7 ,I#$ju\鐦J:lnQ(J#ZU4xр\ER9w;Rw%[h'a𴑂aN>#(.RX*|oZl>[#x^OTVԞ/6I̴{)y\ݪ۬y֩Y Nא7>J?fTML_>xND9'$k]tƞtU~)PE;)҄-, =y02rM9+N]f۰I`~?ӺRUO168S!A1HffhDyQI.tQj[- +OJ0j(r 3q&9>mQB kcx:LI)a(UuE5WAP4MccnGɚQAy!eISʻx Od//) sC'3DI~dL;W+P'uT:~;";~˿?Z9 *&y\e_ULI#P@bW3 Hmn~Sq! 8Ձ+S)@jAk;[^k[[4itUVJ꒤~gp,=y+oݿ^r7Xs/Ye(ǧ@kgN'/;HyE{4Pi*Qq.NocվsU~YGS:=$ab5n_SUq6Up%Q[P=Z/zRww1Wy!1Y8J6#u]HZs>i#X2 Oث䮼[I#dYW&1ޢ!w7Yc]o2g-΃]tϮ^=cm mO68z;ڻe]Y[y ?юC#J}Z ~s!H۞/u ,ǖSn+of.:ЕoI0 358pl+(v`Ǣ#}'iB؛eY \s9ub TUI'TRuI'P'rr[=}&Hg8^v=gpcb:deyО888qPbQ|vW.̵p}nMvI#xe0}(A]:KyMlC5QfSJm5$)ZzkUQrM42nWT^8kH ,C=#2yWr ^Z؈_A:|maW pՒXyJn[rB )~)aEF\WIiaw TZcuCL$UuíEevE"G#fJ4=/ h- zhmD}Mf͸T@Sށa?`(i>mT0 t{_ ] !?j _<!] ěÿ̖XYB>2JKIٷ\Dps9+cӝiHLۥn7MQ۽l#~-Qb;]Р/,L|g…ƁfTI (̈/E+⸮Z%!(hXHLwQcE 4 B<"Ood蟢H U'mw ( 4TTS wOo>T::V}Tnjq.^;-FemekDdT=הuT]m~WQV[zKJu5u4N"cu5SzvVQ}Jh=KQOdSu%C1_J0@(IvBFdOg._ 8 BJz$ֳAUP*1Zh%@gkXzEj 1i/K]Z]F]uJзFn-(>{3(|6̏)XͺJT-W` u?eX]aoƾ֫Ewyڏ>6e쇭9<)"8! gߍ}]tS_qi*_}v1)_[r?Tyjĥ1 ưb6WUp !5jjbj!#Z_|޹ ϑ%Tb 1l{@AHIPOX]d:`5Pm5jKu G%h ;_R+Бl0sZ%bbΑ(ݗB!\֔SAOL*{shO2>bnҭ WՂc~7/"YGD5}dl[;Zk-%]^[j60eq Fi):^ RzQ#bO:GׇWS bӼGB;sOW{C ?1E4HoiCøڦ@*VЅn W٩NOy{;X F%>WXi)QwXP"݆(-.Ҭ*.2(N%ytuCWvĭSN@_oA ;EAH"}L[i*$xJS;=A#4zͽ1p KkEQ^UE^KCү![k aYa'Oqb.N,&YbABh.,,XOG}245]*=n;1Vwx٠Fy^IJUٖY4㕽egrҳv6fPT2 ivaVqBh.&A=s\/|;DNU1$ 2rl h7 UqHQ!0FEKA2x}CǗ53 E}C+5ե=uROwO]iq[AgMAw)c-:2o7q^UC㳓Qyi\vmXe"3'FpO ǂQ0X.[%[sHm SM6SabX,d<,<)@XOVƟ㫛ڹ$ڊHwȤ6o,GCg_])1< .~mg_k­z-QH{]C=P(0ii-DmLJų}Ihi#ANBHѥTR)#OF[h0k)@QFfgKTK*ViƓŽzycO1jh{Қ?}1@&Ud,@ߐomϊ~xڨkEӎV= xC4Bh65͢|S'yd]f$ZMAoa*cu-e-,9'{AjVUs#!w³]ϘݹH0* RR'v {zBW)9k*ZkTN%o-7~Оq{dgw&&M*&.oe#VPp*f+o?dA>NWM!ddbO?i?GX{Hi^@4(|qI.s&Z+J^-65xׁ}4,@z$J(x tOX%{;NHiG/z 1*UDUMgMG: I8譗1D6$쭅#lC1@Շ J] a4y5,H oi7Ukz3Zϕ1޿Z$KQj+Gѝs[W3逶L8*EϫapМ\c$1YkIcWM HD,kC݃ nQMİsUll`J#<0E6,EдÐq7v3prN H[ y]!N!%†G"P.cW`R(Dt(M.AƄt[?~IbX:d &LHu??jRaM1B%܊injW,$Bd.ʼnʖ9B7[((j0~쥱y#(&[%ऍXʧ/9T9ogQRDD HڣTO75Sq|'B_6ÁuGZGJFKUA2!sb&Hj<EvzZqX1e"I@TиA/1Q _"@V1[bURaoC;%܊F漟9)/⃳Ի'*Zpj:W3^o)e-4CO7r/$hvsB8yڧyKSYhPlYiL~c⃊0w$"|ͰpQ+f򒑮mxPm"d ͢Hj<EvzZqX1e"ID1p= ^bA:E8?&[Nn~woT_[a#&"Q'| pb4{?Q豸d.Xk.ӏ]ZvNrĵWBFk0~쥱y"XiHy&[%ऍh^/9Ty T5QT6 jD1h ZȩSjqЦ;(jOFM ȒH& H56 nSnw GEҙ/XNK6ApKt\*j[:'n7MJǃx?օ!MIд{\\:]H~'#} 4-lnkhZM>\RՉzR\]cSZ+O!xz( q7<3a-Tpvn߰oq83 Oha1r{Zj^,܌=^5?3$c++5 RuvH@BXJq yǹEq"j㊅RzOpS샤1]C:1H$bxnT@+xjO_W&.Ob^5Ԅah* [izz7N\ůGD)]4B&K>YWni 9e恢lsRSDCJGJIPMPOTQ%(t\^-oC䧓up7/ K̈́' 08YsCyQ3,ؓae㦨I)vxŤ' I6oJ,x16YPm0jKCy/X_+Give o65ɾE o箢WxErIfͶ=˄3GqݧPͣ_c`ۨeS;k) ֪^YE8dQaIt*"fxxmV<mƴ3*jnAY}DKz7*ImAc%ŀNa;_〟?X)YAwV2[ h@xf>[)uE DGQw@c` cl 292Q*rleOȑzpMQ1vKrE[Z{ q`PSmF;3c(C*;)o' ygܳH-{BGcPZlUMatjaO7M@GҤ`{Lp|<6w8Utl#{Eymw2]T 4b+bZcNp*38d3<9bguK-WSt?#Csx*E8P웙$GTѣD֗nRA,yϽxZMk{+|DzHixw Qk_RRVX,QVL;}(ӫ>YSN]kEg5^Á鎗nf)~>]VQH`xD=$:EbwOm#|mD2cХt#\E-H,>X^b[Iغ닎#V5uGO亨6b*;Ҿ7R4+"g'섷^©;1]oT*wMMsIMU4saF]sa~a=&F[U8YYIܢU” |EmLtELtLt p07ڡLj^e.4v M)@f)CM= ܮT"HT\1Rl|f.]U5nY/I#FL~:xYF!Iغ닋m.>5uGO亨6b)|o&iM9-=VD_B[]/aTMVqBŐxؿ7p;& ݎi/𩪦[61U;b|!LkqgN)}VVmRQH)1E:G3xZ)/'Tyhn(AsHh6 xD=$zncx3=rP!RepǡJqWhչf $3܆'&;b.ޫA㴻Xm? XoUyK)M +Kqk* ;ކB{D(cKh*j~ * }pօkqgN)}5ef&Cks.*eG¬.o2/:ID^nWϹ3a@֚mQxl p0Ck-BX,z|8r]k!Z$S 06kjziP?laۯZz䚭hr]Gd\;P~.yejs tMO|nÝ }(bGkS!TerJ'J~;ńlBLnԪ "@^Q蕑1U-#7G,W.#n1o* eCu6$ʋ9y7pQ^d[ib9E;tHBq,.TUQ4Ee F޸9C='tR&l&4#zF < :յ_ $Gֈ}AېZ5LrvGݣt}(w1~T-bMEk?y_>2џE0]Z@glnU~5Fᩡ#ޖzN6@*\+*j4rrrrI<>JOćI \\˦TѼB\KȜ, 8ey-J%>zO䴾a 48XrXQn&5{DKJ8k= x0eAYbW=yYױ0iׇOc'o3g߁B-q 2m.t[D%ҕ+V&b"GghܖeRSG IdO>x^hDɃe$ҙ,Kı,KFD$_J=BOuS]YsS922 ᗙ1,oCG.PvAj QXƼ0:DC}g"ӍAp8":zMZw;ъPy{Xm)o v/MAq@l #JrBmՎ=OЗ2]#R3v@),90BrKkʊYY3U69|͡{.c\P!%Yb!%M+ )D;`g7ۻ&%]s * ;I@$@Hn&f)WkVaT 8(SDŽg=a iMZ$Ս}VN̓Qao  -Ù3UOD8m.ĮCePο^9Qd|:֊[oE8|d'\ОWcJ&AHIcb1׉fW9d}†uz."ثꯕ!s%$پ (.PWnW~˞By0֩zie˖6MLXV:iiLc^MRkOm{SEMQ1,L yd!E-$ B13jr%%-pه[Uxl*Z'g&y>tξ?GQ^%ɿ.S! ٫55 gqc!:+5$;!a9a]Ю[$6~#kĤf@ [#ٜ #DNiԾ[rlϭ ɀMij-s-VMh 0q@% (ƲA4rcnH_n(|#kڜr!Ml,?RԐ:q "oG:q`kîW0t|ʾ͘U$",$q'ʩ)?3/G*{o)KTȤ(kf Mf=Y{4錄 -MIŅ)X594UwB alڴASa-lfp \`'4IREdMl_ËϦr3!KjÝi1ʌUݑOyldD@zjHІ87z8m2K[îW0t|ʾM3 hN+yVORMnREdMkx0ތ!?2*PL4!2bѵaΎi4F*n'f m!i&XC~ t!!B$M^N?b~ۀ%-puyIfUxl*oqiUSޗ*JmOzGQ^,kjL?ɧ&Dm %#S:P VSGٵrZ c @#YS<]VU[_(*mcnޫ<ߔN31MJ!aJ"-V0{~ rDJ],f|_JG-r薛=.z;c(*&*­2o:Iյַott{9[TW fǻݰ~{7LلiEkU! _M*Uuo[ePa_WAB ~7WQ__վ[탓$QҐB[Jg[+ܱ㴊tȳYe[S+q>&"iK ŏ1'ūmj"ƩiB\'(8!@ pކUg}"w.AM#c/@XYaIaH!M-0Ee#J!6gDև.-oQ\2e ~=؞ng6 -TB9JB%%̄^vTG׏.$Z FL!$HINh!Q{NP}{ \ N!W+d7pմ4V}>KqW0߭Fjˢ۬&Bl7s4)CHŖH2I?-r"ŔgHⱦwt$K͔˪o^VںáFs/E{p`+];5źDf I%|Ymj ȿw-j=$)IİY};/d0#xMU|hXTCͧ4T5RE8U_9AK\=deisFv0n/hų7oqkm_MCͺ<x].8n T 84IŦH?K?nU\0kLge#i 3e2(Y{1;նQK^mjH^xvX?JWzlKϗ@(Ai3On-R/"RZxd9zծ{$#p)8 /f_/@tmL*{r&_G= r_(z6k zrpZ 7=sYmaV`ƣ;7}ln=mqO_ܕ|\fn35Fjˢ۬&B tR VTIbEI  f iL:Du3"_tfe7 /pF'z 3icI Ѹ~ݾ ]]bnJ r/n49_Ok2"!R%.NէA9ZIR>=a /gzedFDgvR/#_fP/=T5REU?c3,k v0cQ _c͏6OX;]|\RNϪdH/4# <HȿR"& /Q .%M%5R":svDsE^7|IL=_Ob]Xg6Λ 5]ꗒTDC*:@ ¬%iA LUрUvʅԃd5PR 浳VI{yΕ}ĕ|3'!rDߘ82"0s3h&oZ!Wfp!16ּKp>r{>p1 (D8FZE%AhH8AcDa PD*fH3)fp (TQ@:HT%~)&$iVrBι/QI)vAUC6PQ[Ub*g)(ypFN܅Ջ^ gp!QGN_x)$W*wqNyڬ-]<+˱WgIȝK3Mb2E>-)n˛OϿ^ͫ-޶2/YtGk12MJ}$${miMYBӓ{/Znܝ`\Ob'3#RT[T(Dn`BӸjGwjaqR{!HjO< .Vm8J]BB=*a_X`.fK^0b{>w+}M:2}t!s[-FܻM ѿ yDHfF_:dZ3%+cUWP\U+'6}r{ܣ@˽4]scQnHXoENo^Q51TA<0 '`%C+Qp-WEʔ^. EF iϥ:QAPYwsޕ[ L߅].çƩLI4kBr*ىU#H AJ52z [ŸЮ @w98yZy͚&H8/ZB(RK1-ƹi>8`?FS9^@L@N<~Ɉ4tי:g Ii#6oߢd; pC#L/2Y91mi*f5QlMp%WkkU^tiA \oMizLCz@tĬtJ$rf+G1ظ#CmL ̓ .oJVY'Oȭ<ߊ}|ڈ|d My~uﵵ'ua?$Zw+,͗^[=o_:DpMW,o^ׯ EhԮQM_owA-$E}]eQXz| 1NR!2=Swy5%!ID"U/h×ɉJwS[y{\brt*R`}$&GzʥMMZaE BTJ-.htRA +%mL&B*gy~LJ?3HWS~3Y~-d=J#XT+%5Rd^/KeҕZ݊NȒU'X;5Z(WS[ #_']:Z՗FX55"br6}O57'#-ti-HY1g }S]I:ͫ)Yh->zx!aܺBZkr+r1,R(s߯o7v!#TU&ع }F1T7RLk3Y"-%| thMI/̬)DՆ$ gL-8{/gﯪ.[TF{>F3 TSU _˺RU}$NvkeRT[ B-#G+TKS/̍fW}(}aSjUtx-JUjbS$wcʥj`TVrG̏!~V=tuebx׺ԊG}'nQJٗ=,zV6ѤR%!^@t+bWVC [+F.r.b?N*5W䞈M@33IQHQ**'Wq]'B1}"k~J4hr}KrGg5 HbR!wCo.-?3qoWv필4_yg+ Fw bD ku v@$#Ӯd}%~]ezkY)LЯGO!gW^[ȗF%U1+i0V9QQ_\ͤOjl+4_K3 \pB}h -ijgӡ k;q9ѿZf4`9%hCWtƂ3D|]YM:r">-2:ajo6|O $[H0wI(nUIYc~PѵʹPt#ZSW:֘9b?tckUlwRW\$wj֚jqqEUrIĊC*S@.}y+2d_>eS^.p٩6G%|Af׶:ahD4}Dm&$tF2F\^Oqz pz\:Y2nV ZE" |nDY"[L@s&"ueY Qh=Ziݵ2@H|oܼJU׵nߺ3udnIÉW4"Xn0?Dy*uN%ʵH[Pszt]~Q}KŴ(i9}[ȠY CΩD|}QzlYG41-k֫aeRV5QI3qcYvS,ciBiF("'֢/]?si aj7#AKsl[(Tu~̌ॺV܍.  x9^:1)ˠdzy8FVL62#VkEDmT1^Ԛs֌I\%lKrŷya#Ck$P[T̡EfSH#GfZ/ȤoMe~΄`&Q]T ~RmCGՎ6Ꮢaֹfkȉz+Fs|ș>ɟ1Sk(ؙ(i[e,Qʚ~I&WfXȾL_L Cnb*!f:$eFU<7 2]V^V(pCW(BA]`1[wD?U= sSjh#-Ptg0^jt^B\X̮!.*]r@<)p!!1)ۥt `/Z68BQR8f;bo5kU<ӦHtGΗ Z,6_/ oEJ18!r}.ğ"J׋Q8NTyG t5ӄ:)J)KWrfO-6SPho;ՙ%LMCfBG;Dy=ʄ)IUY THKr2)t#H4$S~fδѶ'G-=^̰A߀V5qLq1yA “n$rd$t J5Jvz'RUmvVΧR#ga})GV߄m0ykn#ѭ z;B+8 圽##[hnƅִeI2,}%+Ęhۼ뒝Y>*Ϊb3KP B!۠NF&cMQi=n7 ^E`N!azG,)uH9MZ ܁OX]b{_0iEU#Fر&(Տ GVt:M H;S Kwgz s9(Oc+y<utuXk'} )i^1m1Φ5a|] NnIրִM05ܑ&ip_: @j):p6*#c Cy-j^*bC+N$'E$څ[QzV}T8䊕dQ+]"(6|Q_`+88V(tR RΦ(DX[H Qr[B6]"֡-AGF|Ŀ`:yߝ&C iπERAéՇHP 9)e`1Vx'? Nh_iְ趘SCt.,t?=$@kZ&HiӍ6Qj7oF*nň-PrZJI8S޶J)X"F6^uT->eU'71 n7ӓ#H4I`6 y_5We,JIFv1OU"KӡL:M"P#`w(߱%Zo8K98fIE]/a 0\Wbmo;0PGfuoJ! +]6}043H6W~\ k WDvLRɍ_VD񪋄n?W&G1۝|MM]UXUZee| 3>'oc$v8p6"EXк'l™-\3簪/V+>8vsw("v6"6:+Z h+ #_ I}>E;!G7tCE@ϛh>O@p/|3h=fj ;AtgaCVT?-dQz/ڤ=\rFtGU"HR)GNgyu Lx}GeԦP2&fq!Z/dT$}-r>*Nb" عas, b(Q!*?M#i*`K{ӥA3IΔȏƴQZLBȤéG*B#+hĺQ텴=e Lj诫C5yw:қ;e_Z"f]x ]Z 'JQ\ CzS;B(>%⸮+⸩Qjıe4mRsxRQ2 <3D HA4'nRޚCp =Ww=zy5}"ACS LF,GbeutWT=G;҂ SF243TG\oEuD44vFg.D}Wc?"Ì;lgqV}mJ%,[7‘ FM6j &Ta&ڑ~Fؖ,IƊk8Er/^DDװ8NiRQvU Gcdo %6ъogbdkWP%|lc/9`B) VVYmItWq/u< xj,S_1hUVN(TrseIKE[b[X-0$ cluLYjK^ U”yp,9ijšWwc04"3EpUmV!s Oi C9v=&-Fؖ,kUgȮ@KȀvd*6{3J}]ʏ+,&d=<1ܲPh@'qR{%[_nVFoٚqI>l,҉<0ܴN1xrH>Z d,|U0Œ#|D ?fJʚ-^8?4nƆcbWt7]=[Fw˄`-WfVҼ[YXX1=ZH+VO]Zlz5bXMF[Vqi _$ *Uv{*<԰>z3trAQiJUvY}Uvfv,M҆++,O# 7-29Gg.IVbhdSk!fQdoagRRpدkmc{58ҀcluLYjĺ{U”yp,[NӚ_jšWwc04#?yiW h®a$K'jbPcrj6REeZd` 9|ˤFJ`|ږQT2gD)>v&FxWWʜ:`B) VVYmiDGN^rk˳n$@bȰȧB.0.-x9x9-^8:ֶCJ1e!ף;Vs Qk~)cY8`iDg-0!EX1=ripd&P @Ahj5R)E#Q 3Q0ShԡSFeA@#A"&f[,gmSC#)0O==n"[w*3Z"a(o)9+O1Jej_9tBއ9Gn cn:*<o CjG6n'8AtsgBJ?)+ G' fsb-dZ'.%ha"AdY: ]MMHNj5RX%!o>H  ˢP鵂(31#BEHD)=2躯%<έvyP.ghmla0r-5InLIg!=g˟{F.ҡR_V$ ͈_oʄ:> }!j~=7ٞ ͇ca67*1HW&'~1Lnf2{+ݗV/'*CW ϖޫ,,ґm]WP"^ fc##o@OW ԄO|}/ ϖ%~Λ+&!S e:ؐOb4!Ud(J؋lat*5% -rx]/Ѿo,&:?Z ١ī?T告1nw;|jy֠G|:@"P|Qvΐ ;b*9;;;# Wvor1!+i"v p |^X7 '%{|/+Ǭ ,9 ;q}iDzBˌjiU/$ny,EY]2W>[DԺ݁? qٝ~}oTUAX6mkR.^WIf#E vX< R{,V_ւ.(\f:Jo9ߤJ31OXʾKSoJ|j쁕`˳\tjQC2Uʜ'8sfm[p9AհB!o$mN=竩QFP*#ŨA4sߵb_(lLceKU]`qH@z(uKCHV{壣R]%)lr3>w,56R^5CKimrFN(u6gmS5^ IJ*Z[*υ=k%5kwd:*sam0PSm\t̍]%:&D_W;&e_$V>n^׺ݛW{"&Qn0UR%/O!>z¾g,fE Hk?w${PM qHSƃZ"6p>DCUZyZ!\*Kn,&^fVETv" ?VBQ8{PvGUG4(X g=Ye dlDyZNOSs纞r%Ovg@1} ZUq$鐘~CE:g;;xѿ'7Ij87'^oKv+ϖ1umJ6Ok ~ܧd+s-k_KNًdVv0GX۱)M"~qwET02BYR}c ;)}%g j7([VP]W#LBuJW'T;8m-ZTo[\\z[maRe+Rj((іN4m=(.[$mOVI ybcK˻u:+zʨ _KVeҘII]vd3sU-z4/GJh"iЭ?ih+R:ϥQ@n^io^lF7X,tc*c9,)h{lom̺Je& iL=KCqYhLlWU]n~r[^HV%PR!`9O9R]DR1lr_@bQ_z^ɺB;>Z!@FBP3eOB -K%K[FuSղC^q-mq5Ί޲*Wյ|tc'5z]1L}e^Dj2{qJ;4zMj]V}Jh"M+ roޓ3>23ϭb~ٗI[> M҂ ǢxbP[\̇XMiMʸֽ@$GRʇ"&=w_N\%ch( :\ a m~[}2Yօ6c_QE%}0_J` ļw_93'[ݕ%I-dԭ-zH,i7~#rIcR&R<8~ű^r4wa8!aݒG{ƹtVΦP[㜴$af9^@0} `״hЮ`̏ q9{|Ҝ3r|2)d^g/kGL>H'qĜg*yJ_Ji8"k 6w#VݶᄀSpH3> 2qУ`1C5,l[yp7WUM'0jڥ6#Kc:A~@۔k6oZj<7a[Z[{9{;֎^)J0Hq<Ԥiɂm_ `inq/?4$J_<ڮdL&eKUǿcr- ^lR %:3T2K\W[9L&Dx`4dGo{Ο#IV+wåvK̡$ m:%H!6iy,OœMobh7Z^Zd3Q`%]qtHo ׂ]-DN-7ş_sfKlЙuǙ.,TەWFsչPEW~*; FZ2F Rݮj.1UVfi|$o[ޑNgr]{oe DV287Ş3mɘkql S# >EY%TϙnpU6dqHWBL҄5dB[dq*;^s`{Jc!X|)LϏf:Z#m;.Y=<| C6!3uuZJkivT1v<~b9\J8GTeMe?iG_Y+#"Ts{l[n]4(@u }e ۟I>SgH||6JC2w=15y9Aup\ x`Dx.s3~qJ ^ݞ(!js(b#Ml,_,Љ% ނ!G p f X}" p3 唙U *b%ZV՚#3zeCaZXZE~ef]-JZ0N0^!?qE5:{&#bP&zL3+akr8+/@9RV)vp{SʮE뭒>""i6\/q 9sc;j[%*Y]~0CpA]"ږi\Ck+{JuUU^7ޭQO:V7S^< ڮdU+Kb\i p5\ꡡx[py #qSS?B}/9|Ѷ5bZ5nOy&}iMKX}[(R P'vibv;N@.T;ƥ\KFOpk!q{eh K 7?2{晴O(d4R|_UT_`J1}z;fzi*o*s$x"gɘTQPop\ +)iN-:gaD%!f?AK>\m9bC%kNAzm:b`p.~#\=/& F#=q10KK'i_Y0noiaO&Ez.lV[< icw.񫹵&rU<~D,g(V_ FջZ,)˲{&=T5 |c"(qTvߨʹ16Ă^Oe5D]KW" Q=V#+NNmL&gs4nu[oXuh< e$->Y>&&d:w>( &<"JZZp`M:*m/܆ ,ql9e땉Z>0lpL02H^É-,Gb%~Z`VqL,UB<OH||޽˛Yl/-ܹƮԗ/dMNvymkkEL]#0!"ʅ>+R/ZҏWOGmʹ16EWUZE_ƯC |!N{0h\6%jqZpsnfq3;!5F~ׯGo$]5^J0sB>&&d:w>( &<"WT8nUK[4хi=4B. )3S.6㥚/} 6 Nŵ:eeh k:q2& F#=zc$~ɋ_Y0V t&Ez.me7rX7q&佑6O:-J|)Vh؆<ʆ\= }V^=*QhbmN(l+٢Ýv3n&K0ݴfgs4n֝Z^%# U(<9@<6~B*2hp7'  ȠrR4ђӳk'KbB\r<&cy%t_El&^mιXu?I6iv0$Y t{t3~ޞ甽xFΐRfASsӬ]>U+UպC7NzP2tIr=JXGh>jiJ{Kskjm'Z.{}bo&4sV >HTQ3!>n{6)AZ b mѴѿnޝvO&QD%9Ʌ(2Q2vk^++7]Ţŧf nT q +3y *qtcZ߰i@HN~j3jVډn# 2w3Ws"㝨ص3Nzܙ;O iv%=3[*=~hq.rtu:/ݥEIr&j+KYMܲk}xjdkW֏hSREY; XS*bf§4ZaIZnq 1Te7[`n4߼O*&P%8d2Vd9p× 3)!h6:TDm=gQrھSdMtϭQP3Kcz=?KK,UEYmY5l>Yv *[Ke:߭:zfR 1EXy.tw݇#V'[uK?1Cn N;GĺĶ1I?$ZփϣJQD/it7Bꆛ;TSS®',?d\d!m""zGO%M*r VmD\ }LxT LaI!@?"l0`|'M1}Bul `3DRdH=xЙц\&jִ&%cO&0Fvi=>R1r1wKntJT9Ȏ&%EgJZ t۰Dyrk ?x0l9WR)E"HYhnN`Kf[LJrߓx 3/ [I C/961\BHԻC] I{HôĬ6tp.:]ưU t]_K L( }f8atDFyfm3(ZdZЧ=U ʇVJWRD( ԵcK(c3QbJ*5*Bb">"\RuʛE@Vy H,ɰKΒ"XTX_l7F'lT$rgXC ı ]8|1*NWvʁ+EV>R6"n*y=ތF g?ui1F>k\(…LXRUԆR5& k;7#Nҋt3=Kfen)t4'ևI-#8B񕈪[ :ܕIփ AEE 6l߭[iŗ|/3iOamrZeI9-^ڊx3i!S^u9)Ũs4S7d`PӏӢ+{Ο)MZ3KŌތF g?ui F>k\(…LXMW걔$tP瞌Whc#Nҋt33԰Qfen)t4'ևI8鴢8B񕈪[bܕIփ AES͝Qi-aWb+2nm 'wID* VRM>7uD25JW1txO4OcI RUcb HpGWwNh|(1j,WvF 8 X:.- \f)xј(r] *68Lw7IZUe3I*ꁧ=`^ ߗ)%vM^-3԰Qfen)t4'h~Ԓ8鴢8B񕘊ŲܕIփ DZdS͝Qi-aWb+2kf'wID* мRY5Y6iwyDKmZuBMp p}fY؉qA@4Gxomr+HY1Rԣtw[ Wطnav~< ;zw-+3 vsȼE@50`oxOc"V5 lsO(r^jL'HZ_yF.%:fvu٬\|[QpPG/쾩mʦh G [\QS!BQiO@m oFucjL*<L_%ހB"ψ6.NO}-)MbBdh}xlK-`Ȇ=f33o ҮF6ͫĎ_`Vk)N`j0NF*0&ѥhT\HEwA e^_<ĴbT!A3C$3O%`g Jx'㘪%}s90n9ޛeu44fqkrMSl[DBk4O$7\xr|K)G+vײ29mkU.huiZ$ NޖڪC =Dށ}4CrB9Iۭ,WRIL;$Z#$~U˂Y!gfȥa -Tݚ հs0]XJ#A@ WH'v[RO-2%|-u/uxQe4<Ҙq-G:ʕ7vy($u|$ C>YY;'-Yd%z=rA)O޲Q zFarB ώMjtG[%B+*!6ZƸ2Mbp1J%C TR^C4e_K}/++m|F`A4tc]u^Բ3 -)t1R/WOu-uI.@8_t|Hظx-dz.yNgrǶj=ԉvOn>qWAMfpW%[=8 ^ l_YVіdĪfu'bBcJT{xiP_MToJS@n`ׅIh7WWv$^5M(&Bi}/%_Q5p Wd,7 M`2#]j"Jd4m"ΔDSձ~Lڝ\#+Q7=Or/bU Y7|ӲYܥ?Y=ԉvOn>tS[8+Ef9* ^ ͅ/_dBhO2bU3Ed嫩;!1_%*=b4/jzgeG)]} 70Uhxn`ȴXśЏ'!史~*ZHW) %_K}DU($3 d[㝀C ̊(52qngJ"IǩjP ؗsTiJzqeE>i,]=ԉvh&L=%ߘ%[Ӂ9_\tHD5aEV@~[;!1_%*=bJjzgeG)]}Ҟshxn`ȴXYg]Ke*h)@93D_K}/)֫sQw11#86W>dKKx 8[H$>Zѽ7NZp6$"dCFƫAo=;_>G?%wG~^w[R%r"ۏD2$٨rU=8善іdJhRv,BcJGFFS)˯= 1υTz>κWvגOTR5YeYeXZ%fD3B{oox fޙ9V JQ'>Y毧g"1:02AnD&cv6iEN"[a-$I[ycG"k(g{#Ճ_JJVMjyt y)O6F (T93z7[eQuK9${OVib?] sQ*.*̰ *?hSBp "aت37>W4mfqU *sjLlZ]LgzPWcm?TpbEhRVT\>X.Td$f&k Xlܾ/(Jki4Ҫhlo]/GmR> c^dKi?E̬,`1#de(=Q&FVT07}? NPHjl7/-ywr*5 U5UN5}ƼY,pɾ+Bkzi q5D- bV$ffbT*jTէ OsNo":Q/zlC%>j LpsqUvd2!{gg&tBt0*63w]weoX$㰻rv5F0Ġhw8Kdc4ceZ՚ooePSD(9t@E2Ƭ\PlZdt /ȹE Kn?5sGkK1K_(Nz#;A_\ÆU]N\$7^Q_UnllYR4Udܷ__tC_]/Β搟Y )+kzkm tV"6=\Rz4Fr ~ho8wnڳCMgbN }uVCMlJeihd6ҫ#4^hλuL3[_m3CQVU@!c (hv)gVibKIQD~ 6Gy;pupʫIzˑTK"Zb*Flk2_%!?ׅ9eoMm1Od鮬]޲ַǡ[JP"dˆaۣE9w-u۩6sؓ$*W]cjg)դ[:ҎmN4VJy]2Z8wfꙟ5f`r>,(pgxU:XBՔt.٘4q `0tpX+ZS^_ʂ}-t]2]2rXՙ`@ص:<"Ha)mj3cgVibKIQD~ 1o4wupʫIzˑT%*Fl ێ2_%!?ׅ9elt3Od鮬]޲ַǡ뛿M"dˆaۣEލǂ-u۩6sj;O$*W]cjg)դ5(mN4VJy]Ѿ-=,ro0Ӫ[ue=zxn$`\0Lܮ9 1BzL`RmTvxd!2Mq 1b`6݈,sI,w.ӊ^p(Y(T N- [wOK_g|rB|띬t9k d+˵hY)QZNTr_(w'I$gZ(gGCFOڐk<5ͼ3FKNx[|/.5,)K蕜'sQџؓh۸E=SFTio$< Va`qEtBXIsv#W]B=rR) 88/]f!Y<㇛\s6i~JQ{k|zH'.DM:rAFZG ^3؝zOwر8 U).ږUIi/XK}7}cբ|tϮXsX.٩6ŎH6oNoa?"'jºi IDE^LR;4#% lFz1$#v]CͦPl&g!Pʅ 5Nw$Y]нP`e:T'sS»S8yk p rd.HqƆҤʇ!4Fd* Q/s%:{EZviT))GAJR$>-x)_yۺuvvmH]Tw5j)O#RRU//nu b)+EnO.,&wSΉkgsd~,[㔬4W .IL膖/ H(U|@y/}E)eQKT _K(2бYh4NnKRo<ͿeGJ bE@u}t M%~IzCas-7A K;,WTL |`&vdR{cS snُB'21bxh'͞P!*!TV쳲[5/HP)(xy8h @n,LmػM14J "Uʖ4: o!`k?c+O)\>Go7$dt$`'ЋF Dy'OMy6>κqu6I'U}ʏگjit]#ggQQT-Ŵ9v6 BVm[Wm_B0ɟ,UZ޺ZjJґmq*e. *JkU2 yJ=I XK; <^p!Ig{JGU2ayL%'5Ջ,JC#(DPJBY(xh! Dp{pY^.SLdI  ^K)GjqSbC(U]̵}w2>-by +#Y8F^5xXZ"wZ?}ZkϹ_uӋ~\r[JI?dJT|f{V3NU &k;:gRo.-CrQ@\jڼo/!tLd 7lʪן{vfZR->5T˄]@|I^jR)G_Aث6޾ gz@NBþ`ӻHJb iKR}M]XĮD? #(D2$MF ̨#!d\8c1X4"B6lfYW*[T>%P7컛kGˆ19ߊ8WHD:21+#T)/e,rׅ$^}ͪn;:tڒQ"tq]테Ӯ軮GT,2UJ*ˋhrmG_pHJںk+zȿą_34ݳ*ֹ:x|9t[p.}"ƿp/ʒL\(ο'փeV:m|x%}Cwb\I1/I7ub+『>2đ6M 2#NiA#dWʹRڦU1 -2XAeܬ] 1ZxdLS#HUhEWZ"wZ?}ZkϹUg]8|tRJ?RcmWc4.U &k;:Vu(CrQ@\j붭޶/!tLd 7qf&k.׀WÙ+WJEp.}-k p/+/LHR|}h6[c}|RXw9wlQE% ~RS|g]x1ߌRJDfTD=HdQV!ځ5@='mumIaCW"H&SY91B[AYzjuKԻbv ΠoԥS~hw5W`r|w6FaҰ镈*EFZJ}Omc[/N\[+]1}m+:ޢ-_eVSX>{nii .x~ӗY]k ᡺  ށ Y.eWl>SXVew ,w=_LcuS/R`T3}8J0yE A;ƒQ+L }&Y ZH1-htP z`n#{\9t!,$ hBh?GEg,hrvm" 3J%GK잎 l.Jg2NPn -iPWH3vq6p1G^ʉ{6G<ɉN'w1?,?z ';31-K΋v5T E? T~=G{;%VMj)mU/!sot*\ov N9ri !qE$ }Y~ZoVI ~GΛ/o[wzD8Ě̯S~8tHw70Sl?]Xq- ȟ0X޷-C^J3Bc*mspD*U?JiX̨=?Kmj=^W,KӦЛJJvdzYaeVi=V63aV`-1UK#LwQΌ^jF >H) z"mƕ5h&J4ʆiGS;먿"RM6,*nQ5/y1@WjcMey^J+r`c౭@CYǍGp,˜忪SȳC> =Q-KzĄ9NҔu:ska$Q&!a @-eU5tO\C/ѶjHY (8 2$!;Ak鸷*-YAR&ȚWŪ&oz 5`&I _,'ו_L-S? -c=YXۍy)5]9!}%c]*ѨSLvE=5T,VPT %_+I cX-ɁH9sDW=`$KTO9/|)u\|OQ`,msI|`c-6 5YWiYU@9J XOdk L:U?>_R7_7U Y&5 nz^Wʏ*<3N$tҴ$ S>eP9@qѼ-b j}hBeW4•^w/úP=T9B#|r,l]~ 3S派^`ҠO+Rzzβo#ifvMl$]%bO }n35YTDY"=1)M,AUKRYOy[7V }w:Aڛt!m6#h]kS;nZC5ma҄F#5~߷߷~C}$@F;3 UopY.}`-@{\@*2ll<=&+e` )vpO>r`++tM6m4]_}Y#v,э$rzr.(e#Kqq@M"7Kv{Ue E/2S)QgWޢf,{km΋4|.[E_Yj%3`qSV7(T/˔s"WW%h@w[m;Oz^bX4d`:Ƃ3@UbRmⵢ^Q ![n53 H *ŢR/sG6aw n+|DWp1]g C{nv5:go6$`O7!N+u'D)ÍESF(P^J-#SE)LH7nG9iՍCa+sEkjUZnȵDæP@(n]?e*q\g}Ʒ-rܷ-!4$.I 5TY ierf0U 'ZE!ʡ$(Bm'@>7+TA ћ1 xl8LC}k,tnr߿R;lB83fY|Y}ACsĻ_VӬ~'< G j:MXwcF8Ɣ|}{ca'X -7ܙ G8s[$ڋb"-18HuԵ+ͪEܨ:ZTa5~F5vAzPl6Ô-hs Mc%i;s(S86VӫVweYf uAݞЋy_Eqef@#z%H.qe~b}рab j+QRJ 9 PZJ_oo]nn%@^r{|lk0ӣɀ/P&!- 0Eʄn\_%~(%Hyyd1 |qJ"^7.^$Ql`$mnD7: m/% Jz˼c(wjoR0E _P֫/l#Lv0wQ=O,zNcS :@[+X P5T^q}P;mrXQPX&gNӴ]v۷"$wҟQ'Ab}@haWb:"}U,+ЊYE&ӎjifڪ4©RA #֐Qԧz=T'Qh :uY摳/|׆1Xb:9r#ZeLtR $Ѹy@mm'xTҚX2Y?9J< yXUp0שJb73U_̓~7OwHrD4J~'iػv۷nݹ" <V=?_dpr>PFj0 5qz#'R¹Q#fiPc43mUfKUT}"0RVQԧz=T']l:uY摳/|}xjv1Xb:9F6eLtu/$Ѹy@ZЏm'xTқ%*Y?9J< j%B!x#%!RjU7~~wM$NqSOpv۷nݻ<4D,d#?p+tlDdD \^xT7Bl"m8fmӊNSHLk:u)ޏU8hE[,25N`VylԽi^݁gE}ʹW&,}V+\.:8\7?Z  o4eR[|'58xpCEA*Jo;Tgrw#G;˒'8H|o=}&NwD߭,2KgK:A} [Tp^W"9Y畹*XHJd1 NJ)^@z(9Sf&%6^nkA.SѻTu)r-( z H$#bt!c*ܻ#л|M=h#$*JR\-jڴ}DW7ueݢ^FSL]we"-X庬y,3wM6uq2j#. vm'˥r7g # wISPgiv'd{F 6AaOĉ7p]wranofk88KG D W<{@`x \0ʝͫqfQcM*F3/>JA %r4yR UU9h@x) ѳ]o?Y#kav6یfZI,vOrZVpBy4ttΥy_7$V\=ovl֋:6PIP4~xEW߉<զ;K-7lt2RUYC[ڽH9dѤ& ,oznWEb,A řlj>Vr?dkQY:$kܝkֺZ\'\"{  ?C&ËMf/-̠"O0I i _:i,L;1+e/N}?PHtc"Mҳac:^Q7n_y;[JOuaPEu-N5Ԝ)A 30,zge_= gRXW[ix ( ||̽|X,EI,X ˮZ˭&q*6*Fk;rm٘Q5ӥ@';$oAuqiX8SVWnv2GRK)%'4椮6~5#'0q>اQ;WOY5Y6S Uɫ)F .Ȃ֒F]q_m nΟ2B2 W4hXՁRKaƾD(̸)I)Br o= $htlRfw RZ76~ú?O~[wg.Q5qг5ws`U7WQ$iJL]VhU|C,h`@IUUynbq5JJ#CG#y4^ +4Báp," "r Dʰg*+{" P$Ψ#!O`1Id+*IH!sN(#3!"TD\U2 0o1w9"K;zX^X+_A)VJ)_ީ^z2CKɝx`7YAԟї7LBop41-agj̜sr}h1n͞^ PnĜ,[ =yF;'21GCdV^{޼CCڝkyP7b)C4w=n>|,caO"LsR8.T@0fmr#މI2xG$Y(@wpaVׁM;ǩ;߂\:x O y ,^ 6W8>3'E"6W )eLnЌdSx,SL O2XC<mkϚAVK!սvj6zm0iSFôlvZ )IoEII侫)n:C[~HkFt͒MLʚԩ6@dIkS KBqaN6Jew^nywko. ol9eLZ״'XulXY !%AgtGa`-6^]\ؔF֊.EnΧN@q|+vog>nFRR9P/] '7hn4(;oFmHm_V$\Pqe/A\C !PZ 憋Szvl/[DM4D+vIU7=**jJJ(hQb_N׭+eg߶%?Trɂ£,-jSr2V. "ɪ0ڨK݁]V}cU*)M9);LR*+zM;X (g:ornT[JF\@0tXatEgqqa`[ڐ s> F:l +/S,` o%,5Cr_(SFZc>Ki*5i'ݙUV(I A[ CB' [\iHm ^бwޒ|UWypEWso'<BdN%91ykĵA8,ssF)Nܴ- SI[2o:lbǺk%TV AU~<cV֞ӱ+~wp֢1yC-Lgپ hkQqo>M%%v^ 1%0͏Cgٯ}{BAJKTa+%& ;/`_Pf/?tl`Rl..2d$D2Jdw[Ҏ~!Q] (VoXE@T'ʩF, V=zkYCHmێocNs[@R1=AӋ{=&%`~^\[{&~MSuM511Ɖ%8gNg63/4_lO-<ٴā"ERN:eTJL`܈t {^l%LT ӳ\ʆⷼi?:~h>~3 DOE;cw)R!^.;߉r:bdCF'4LGrH03(̽pC{43T3br1aN-V.=]y)N2Hr/% P;_(0H!D,dwcNx.2!Z(>&z5Ĥa69ME԰Kr.ބO$`武7"|l,<õ(}gaӱ:IdF.eJR.ⅅ-%I~MZEumU;7vݴV." ~SzĦ(CV|FvbZS丆Xl~$"'= 3$$=%fy%~ &ؒhخp46r,rfg/|,42if m5ZU/Ob IvL= Ps6 y23?L(ګZO\oۗ=UTDX_Åݟ)%Ԕ)yY?,D|m$مaWj~V.rR]R*e 1cn~I6L뒟 H<ԅ'z)Z粼5f1.J_ҿ)K(ʛ%!Q &PMfx&b|M}2߈y ڋؑM &DmE^PiuՀf4[MCS|N"JIL]w71d~h(F`_ l+'Mgp ׌9Kp2LLhBPeML`?5}v0K.Gqs]e+JF-O]H?P6{|d=Gt[7 *Y@*&HV7D7EySRv%$7\\/9h 5$!;Ug.Ȥ}R dJ-.r%uݬk%keCnIn5+b =-|ʤ}QX+? VY(IlrM-&%~aMU H3̪GI\8B@P 3=oC'9YV^@ō;%A@B4Ǜ@> JIYlނ+^3;DS#$U~ 0ΤƄ%T=`?5}vdv?˷=/"-O]H>a a(yki'{|d=G!;߰|M__[7 *Y߾$ dkc|$MEySRv%:BmjO78(4J9n1"%Č$}R YUQ, v+ַvQZs䛵[\Dn4j7U@tJZ@CRwQR\ 2Y OJ.!hT@nݻvC49gS1 m -y3 ,-1Tl\]7,N^GhƣӆRoX-‘Pv䓌z3 &U'C:ER?GZ.35t]XkʝC9k sk:%\qWBq0X__q{!Y:S@dz;8JYqag}Nю9?k{9eSsu eojM]4X+6e+\x[aL+1 nl"lR?!!!!!!E?Nfҙ6"+l /9]}XCpB9LP1[pOʂ9"Cl#-c&MhZXZ &딞fo *GťrCjTe]f޸)m1c3< 9qrt"b۷p8/UYvu9 6jz^clBjr!'ڍz)R?Yg&3o?!Q^QH!eNw&rtV/>! {:?$&cBcDRU9xxȹ *{KH+eh;5mQɉ=he&?Eq0Pr\glVEKj4 A+ GTF29͘(FZ~wSV5^zcotE|:m_Z9"V'M$7(_TD4bOPU8Hcs4p%Gk~FQ..aߜek+=J*?^zʀjvB%'.s7#VTKQ4{{v{g5{mWfcͧx%<ދۼ u%(e) >e`ȳb3PvjB[6$D\*نoK4ivWqN ,zX/]'gҴ<O; hPm~t4RXJس EY#yw_1fK"n̑άJurJ~.ɷdΪl-PsB o=M\~B'SH4a롯^x%yCz/o̦s\J}5w& 1`@Y11CR=aC;c;:vX'*4G]Xݲv5pz\,#?P^+.89!i4gۣPS Ͽxm\}*~EJ*ę;\5PkX*E_UJʷg?ečOLi.Jm32I=۶Ajջf3ـtʕ3-w+ vb*!?I}HINXf}w1+8]=;DBIbыU\pV(0:2uI|l]`;9ْaG,|,|Bޠ$ A T3jC6D"ڨLRh^8,nؕ}6k/R>,9}\.O?Zwh ~TM,6OKg+-[_8p6lւ\sYkyvTvu]&0?mE#{[j]Ǵ*ykgd,;YH(uH 4CN e!ξph,".l&&dW%Ϩ"$A2Nnc@׏l"ARxhTEtg^9Jr?̉`2zA(3e~DxDU,ocXzߟ*Y= 9 ye ?0/ ̳Qew% c=_DacV)wɉK7S_V1H)׸ /r)[(SbI3)] 4;%8b*!2=z__u_ϰa;r#*Z4ӷS޲M-LQV&jrFVFOb?TE]F /F9rKOU>^Fwm<몛 Tzi4:Lz1g$,u.KBuJ;~fNZOB|hǰm8% 8@f&4:8 Bx$}gQ6 Dn㈏]c EGlž5a0R8&iXN( 0$b '~*CP,Bs}̀42G$\k՜tͻ._Wӥ\gT&u8gG}|%dc`yG%f2cCz0\qp;g~/徫OcUzwFD_]C2[0h7ut#ZkkZMGTQ = Є)B<1VRV0v!*U11 [+MzQ4-q}?X*VtB/&+_ ɶ-V9<`9?Ҿm`0`LG@$MfHeL`E&3XT+ Al+.CRS3ʹVOxU+ GoF{i2݂a-k҉8!fFÓt)YW=sf؆LYȅ\_g@} ؎:ݨ2Z–h5 [p3gza UtQYOSSeCNzGnvᵡb G$;?yu݀f4[MS};ZȵM]g" V|\nXuD`) D#Gf@0\JiSYtٷU*k:;MFwr%wDOz%7iYMMJetjo 7d7w4#vg[sgam}HY+7bV*&+Rҟpm?T]U)Z†|ĶƿʼLY'8lFUyeHCq]T$H}9WIFTXXtDvB' v%niBE|b( %BHH{c&h(Fـ A#KUb u9 IIġ+VjLim+q́3(\7S&;uA3j*}vtt0۰>;Ia?lpB@F<5\˕H$YxZEJjY@ 0=TNnBM$yS}, >Eٸ9vOH-rt=+n 7sK|1/'|Eiq 9{L)a՝GdqιCxvW>GVu"v>zARࡿ./:4֧bh,cFA<w$޲N MC$ɶ.,ұU꿺I~UIJMGR& RxnqF,lxcg %vIQk˝BS~B =_:,ؑ_AJ߱)7dQyI5mO))lȑd}E_%Y1T+NӬ}ONWgZ觥)aGM,vݹLw:6D4V%z\l%{WP$+-Y2~')_ +e]"NhA#KVȶr3PFer{wBPݓFAv)YJ9;2_U҃/濨 *x4_4 'l]BБ!8).V #?eU¦ζU,:޿9ٶT;zůy I׭ ~T7I(>kTed]yz\yc”לT ݵ}T-[q`YwˊtK\|gy XES(05rDw%2c܏F,q ;ܹ_rư%ힰD1L#eLoD". }LZ{V~K@?H"~~V΢CAN&7같o0 mұ( ͅ L錚ZlvĻ8k u$Wv7"B-d"[/?P  p13(WTHУ]*oHȡyYS8ٖiQiYV+<.1X3qD'6bo].E\-f[::J&F[5g dϡ|w&.^*}sG?9iú+(w{{F4L3~G2Ehz|6Y zc>HYaZD%Dqi% +`&2!,lkjAX!|uzAزdT/7hI ڕKNxotKR[mEMтF& ?GV:w4!yj nh80ľL9r#ngo \kY%'|,YC`5 \Vڲ&GJnֳ32*,EUȺ*U83\e~6 DK/̪T۲ _'?$R$R~ ȗeOO޼zWWBzI( ͬO#]8e_\6a@MffX|nJYɄA,S.檫ҷo,$IV>  KoNЦdaK#ӃPPOôd{1m֋99,~"մJ:R 0~Jg|pSyG>=J,pwYw9IvXf*U'(/̖h;7Sr: qJ̤$Eܩ虔?'fRv>sM*JBm*eaeٞ+u6z1gXu%ﭻv@dFkkWbHn]yJƻ6bk2W`D}˂2On F"~Jz"dXS|@1rG(L2WiߚҿDjŪ*a|/%Uv[uanۖei6Uq\V][vգkwoYumSSeqPӖ 7T5,tܔO]}!Igj]EZ}4r=Z!Mev)j\˖XuL-LZ=k~B dy):eA8q52A6AѶ϶g[m#F%q \AKs#h@> QsY|n'EckM*\ƾS)hcvy?D8B3d^jkJSY*{CAhXrWn]edWnYbZv}dV]qZvumVye]{`U%MLUCNX4SH詨'rRu=v=%z&m.kFHʈkS~)|=r.Z7b5jF,2j^, A:Ruʂ RGb٫d%&gGj4>bcZRNs?1U ᑴ {qpՅ(t,>{D#aZ%k8ȟ0 )cv˙N.Ȟ2rǣ#>'o5D_5ZWȑUUSصF}C! BÐ䪾r,;"Zݷ,ӳ&ʲ+ӴnF׼ .޲*jb*rnkEMFY>)+ߑy'z6{yV$idʈk7MZ,2wb5֯Ti2i+aDW*/ϲ-+Tc@ᢃI5Q>f` Zu~(9`kpGxe$IՓA&̵ˮZT2.TpkEZI" G;&eV$0d8g>1Tl(mǰh :oN{.IU^~%^Jooan Fo^I2ۥw5LsF0AQbꭵ[іf*pI⧚O&*It~kAq+n.IYZS r^$#ZV]X.IƞfpNZ0V3Eu _HGYѐV.튺LK)(iZZ+F*I HZӱ Y0 5~Bj8ߘGs+{SR"Bi-$`VS % 9Ki΄P&pU~/nNrmmW|GjGn \f`.&&PU;1plFQR2A3A7B I Lth o(Cc(YDFdcnwre~HW@Pfu /=҇'[tJ j]}QᩚjYvkᲖxyxdYR]mXFhrZU`е !Tx+3Ĭhj6q|C{:3 #Z!!77M )Roy %Dz$TleRJ+JvJt'K:Q̦It30d!W$M@Z؞NŠ/`a0MP!6c b,ɲCnL3A68ydxm, V=i+B5[Z^kw\kJf%.~۹ѩ^WK-h'{tnP+ٷ]Y1܎-W.#=9{nR}:e^z SHi]=U%>Y(a1 lQI R-&C RJ/YOUKQGA3- 3u0aJ[ʜdiỊ3 YHpcjwW[<1%o% 7A b_*%7$01&ʪJi 0ph-;Glt' ۿ%Y/@˔{m^%zY(Qq\4QFl֕&:KZw:58CZ>N vܠWv+7;Ū]Gzsn庭OL]RK}=[%/Z[/UjR_$#n1=) ZZL%PbV'TB4-T3L"BZQ| Y)*¦ n?äfQ $8V䱵OHxiH\ @"O!# BlL0*̛*FCnL3 N? Ch+rW^JAj[EI_k΍N^9kD;:B](݊qjtgi!ޜ[mnr-" WMJ.uy DkJJ)uwT]d=1ۥO`2HJi2 (e3VRm 'YI[Іp4!Zu@r%G>߆Ew,xN{,wbƸaB6!0¬dpDrX2D"R$zF;z>C1B1GՅOc^d2vk?l۬w3:|=~/=^\9+unR(ZlH[% Ty::eVȇ2 R-,\p1jiG_V1Ⱦ_pi30;O.<,d\|E]VG c >v2HռM!75J u^5BK-LyF]M>4am]EwmΚeh:4of&L%C Xt~?`TޣF%5] i2g!! -AG}HHc7rIǹpܺmޏAU?==4v~mzDS,U i垑cXTNObɵǹU<)mI`餓ceք %ΣSug?~<|q Őfs0ӰBbWXH{?'^{!Ń ieΚ"c!T̔ W22} uӍ ' V#خ@=Ga:A8hRR`JbMg,ԱEF FnV4+$ݭg܈8ַ-6NK'ҕXXr䝪) L]SMKkKRyI&?o{xYa,ˮtxe_GⳄUS:ӌBz )+1n(fs+Q 3DCEQ_q&X%|Ifa3m7e| 3- ~Ɇ0Q b#%vG*S]$4+u*1@ E* ٬9a:Jrq&fR]l'7Y.DH%MLop]PR$=rKxR&iBNቾ)[-P~ȰnAetUyrsߐm">Jy*}hȉ ڛ˪ [y$I/j@$-=#ޅ雦7E1keT,rzYun~;`ͤZV%a{YV֭sN*TT5.`GezUeڨ:?Rn|oq,+]HckAekjs !r22Y0mجaH3@ ;]|T::?FP'18ln εXNc0ݤ]riLL3u[o{ HapG_ciG<&{FJ±;zTXGZ)6ԈNAx獝e˵:ۜK7 lglNKޯ5fPv?At.B.MJtoBlDPKw +s1P4VL+q ҰX9 7 !=o˸&hg7k)I!Kk"K_A%?3rL^rQvύzQ!PB'B=,Wc~%_QԪj˥=7*(W{{ 31̗8t!sC _HnWEok̅+ { store.put(value, key); return new Promise((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onabort = () => reject(transaction.error); transaction.onerror = () => reject(transaction.error); }); }); } async get(key) { throwForDisallowedKey(key); return performDatabaseOperation(this, "readonly", (transaction, store) => { const request = store.get(key); return new Promise((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); }); } async has(key) { throwForDisallowedKey(key); return performDatabaseOperation(this, "readonly", (transaction, store) => { const request = store.count(key); return new Promise((resolve, reject) => { request.onsuccess = () => resolve(request.result === 0 ? false : true); request.onerror = () => reject(request.error); }); }); } async delete(key) { throwForDisallowedKey(key); return performDatabaseOperation(this, "readwrite", (transaction, store) => { store.delete(key); return new Promise((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onabort = () => reject(transaction.error); transaction.onerror = () => reject(transaction.error); }); }); } async clear() { if (!(databasePromise in this)) { return Promise.reject(new TypeError("Invalid this value")); } if (this[databasePromise] !== null) { return this[databasePromise].then( () => { this[databasePromise] = null; return deleteDatabase(this[databaseName]); }, () => { this[databasePromise] = null; return deleteDatabase(this[databaseName]); } ); } return deleteDatabase(this[databaseName]); } async keys() { return performDatabaseOperation(this, "readonly", (transaction, store) => { const request = store.getAllKeys(undefined); return new Promise((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); }); } async values() { return performDatabaseOperation(this, "readonly", (transaction, store) => { const request = store.getAll(undefined); return new Promise((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); }); } async entries() { return performDatabaseOperation(this, "readonly", (transaction, store) => { const keysRequest = store.getAllKeys(undefined); const valuesRequest = store.getAll(undefined); return new Promise((resolve, reject) => { keysRequest.onerror = () => reject(keysRequest.error); valuesRequest.onerror = () => reject(valuesRequest.error); valuesRequest.onsuccess = () => { resolve(zip(keysRequest.result, valuesRequest.result)); }; }); }); } get backingStore() { if (!(databasePromise in this)) { throw new TypeError("Invalid this value"); } return { database: this[databaseName], store: "store", version: 1 }; } } export const storage = new StorageArea("default"); function performDatabaseOperation(area, mode, steps) { if (!(databasePromise in area)) { return Promise.reject(new TypeError("Invalid this value")); } if (area[databasePromise] === null) { initializeDatabasePromise(area); } return area[databasePromise].then(database => { const transaction = database.transaction("store", mode); const store = transaction.objectStore("store"); return steps(transaction, store); }); } function initializeDatabasePromise(area) { area[databasePromise] = new Promise((resolve, reject) => { const request = self.indexedDB.open(area[databaseName], 1); request.onsuccess = () => { const database = request.result; database.onclose = () => area[databasePromise] = null; database.onversionchange = () => { database.close(); area[databasePromise] = null; } resolve(database); }; request.onerror = () => reject(request.error); request.onupgradeneeded = () => { try { request.result.createObjectStore("store"); } catch (e) { reject(e); } }; }); } function isAllowedAsAKey(value) { if (typeof value === "number" || typeof value === "string") { return true; } if (Array.isArray(value)) { return true; } if (isDate(value)) { return true; } if (ArrayBuffer.isView(value)) { return true; } if (isArrayBuffer(value)) { return true; } return false; } function isDate(value) { try { Date.prototype.getTime.call(value); return true; } catch (e) { // TODO: remove useless binding return false; } } const byteLengthGetter = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get; function isArrayBuffer(value) { try { byteLengthGetter.call(value); return true; } catch (e) { // TODO: remove useless binding return false; } } function throwForDisallowedKey(key) { if (!isAllowedAsAKey(key)) { throw new DOMException("The given value is not allowed as a key", "DataError"); } } function zip(a, b) { const result = []; for (let i = 0; i < a.length; ++i) { result.push([a[i], b[i]]); } return result; } function deleteDatabase(name) { return new Promise((resolve, reject) => { const request = self.indexedDB.deleteDatabase(name); request.onsuccess = () => resolve(); request.onerror = () => reject(request.error); }); } import {_item, _key, ItemSource} from './item-source.js'; import {default as Layout1dGrid} from './layouts/layout-1d-grid.js'; import {default as Layout1d} from './layouts/layout-1d.js'; import {VirtualScroller} from './virtual-scroller.js'; export {ItemSource}; /** Properties */ const _scroller = Symbol(); const _createElement = Symbol(); const _updateElement = Symbol(); const _recycleElement = Symbol(); const _nodePool = Symbol(); const _rawItemSource = Symbol(); const _itemSource = Symbol(); const _elementSource = Symbol(); const _firstConnected = Symbol(); /** Functions */ const _render = Symbol(); export class VirtualScrollerElement extends HTMLElement { constructor() { super(); this[_scroller] = null; // Default create/update/recycleElement. this[_nodePool] = []; let childTemplate = null; this[_createElement] = () => { if (this[_nodePool] && this[_nodePool].length) { return this[_nodePool].pop(); } if (!childTemplate) { const template = this.querySelector('template'); childTemplate = template && template.content.firstElementChild ? template.content.firstElementChild : document.createElement('div'); } return childTemplate.cloneNode(true); }; this[_updateElement] = (element, item) => element.textContent = item.toString(); this[_recycleElement] = (element) => this[_nodePool].push(element); this[_itemSource] = this[_rawItemSource] = null; this[_elementSource] = {}; this[_firstConnected] = false; } connectedCallback() { if (!this[_firstConnected]) { this.attachShadow({mode: 'open'}).innerHTML = ` `; // Set default values. if (!this.layout) { this.layout = 'vertical'; } // Enables rendering. this[_firstConnected] = true; } this[_render](); } static get observedAttributes() { return ['layout']; } attributeChangedCallback(name, oldVal, newVal) { this[_render](); } get layout() { return this.getAttribute('layout'); } set layout(layout) { this.setAttribute('layout', layout); } get itemSource() { return this[_itemSource]; } set itemSource(itemSource) { // No Change. if (this[_rawItemSource] === itemSource) { return; } this[_rawItemSource] = itemSource; this[_itemSource] = Array.isArray(itemSource) ? ItemSource.fromArray(itemSource) : itemSource; this[_render](); } get createElement() { return this[_createElement]; } set createElement(fn) { // Resets default recycling. if (this[_nodePool]) { this.recycleElement = null; } this[_createElement] = fn; // Invalidate wrapped function. this[_elementSource].createElement = null; this[_render](); } get updateElement() { return this[_updateElement]; } set updateElement(fn) { this[_updateElement] = fn; // Invalidate wrapped function. this[_elementSource].updateElement = null; this[_render](); } get recycleElement() { return this[_recycleElement]; } set recycleElement(fn) { // Marks default recycling changed. this[_nodePool] = null; this[_recycleElement] = fn; // Invalidate wrapped function. this[_elementSource].recycleElement = null; this[_render](); } itemsChanged() { if (this[_scroller]) { // Render because length might have changed. this[_render](); // Request reset because items might have changed. this[_scroller].requestReset(); } } scrollToIndex(index, { position = 'start' } = {}) { if (this[_scroller]) { this[_scroller].layout.scrollToIndex(index, position); } } [_render]() { // Wait first connected as scroller needs to measure // sizes of container and children. if (!this[_firstConnected] || !this.createElement) { return; } if (!this[_scroller]) { this[_scroller] = new VirtualScroller({container: this, scrollTarget: this}); } const scroller = this[_scroller]; const layoutAttr = this.layout; const Layout = layoutAttr.endsWith('-grid') ? Layout1dGrid : Layout1d; const direction = layoutAttr.startsWith('horizontal') ? 'horizontal' : 'vertical'; const layout = scroller.layout instanceof Layout && scroller.layout.direction === direction ? scroller.layout : new Layout({direction}); let {createElement, updateElement, recycleElement} = this[_elementSource]; if (!createElement) { createElement = this[_elementSource].createElement = (index) => this.createElement(this.itemSource[_item](index), index); } if (this.updateElement && !updateElement) { updateElement = this[_elementSource].updateElement = (element, index) => this.updateElement(element, this.itemSource[_item](index), index); } if (this.recycleElement && !recycleElement) { recycleElement = this[_elementSource].recycleElement = (element, index) => this.recycleElement(element, this.itemSource[_item](index), index); } const elementKey = this.itemSource ? this.itemSource[_key] : null; const totalItems = this.itemSource ? this.itemSource.length : 0; Object.assign(scroller, { layout, createElement, updateElement, recycleElement, elementKey, totalItems }); } } customElements.define('virtual-scroller', VirtualScrollerElement); export const _getLength = Symbol(); export const _item = Symbol(); export const _key = Symbol(); export class ItemSource { constructor({getLength, item, key}) { if (typeof getLength !== 'function') { throw new TypeError('getLength option must be a function'); } if (typeof item !== 'function') { throw new TypeError('item option must be a function'); } if (typeof key !== 'function') { throw new TypeError('key option must be a function'); } this[_getLength] = getLength; this[_item] = item; this[_key] = key; } static fromArray(array, key) { if (!Array.isArray(array)) { throw new TypeError('First argument to fromArray() must be an array'); } if (typeof key !== 'function' && key !== undefined) { throw new TypeError( 'Second argument to fromArray() must be a function or undefined'); } return new this({ getLength() { return array.length; }, item(index) { return array[index]; }, key(index) { return key ? key(array[index], index) : array[index]; } }); } get length() { return this[_getLength](); } } export default class Layout extends EventTarget { constructor(config) { super(); this._physicalMin = 0; this._physicalMax = 0; this._first = -1; this._last = -1; this._latestCoords = {left: 0, top: 0}; this._itemSize = {width: 100, height: 100}; this._spacing = 0; this._sizeDim = 'height'; this._secondarySizeDim = 'width'; this._positionDim = 'top'; this._secondaryPositionDim = 'left'; this._direction = 'vertical'; this._scrollPosition = 0; this._scrollError = 0; this._viewportSize = {width: 0, height: 0}; this._totalItems = 0; this._scrollSize = 1; this._overhang = 150; this._pendingReflow = false; this._scrollToIndex = -1; this._scrollToAnchor = 0; Object.assign(this, config); } // public properties get totalItems() { return this._totalItems; } set totalItems(num) { if (num !== this._totalItems) { this._totalItems = num; this._maxIdx = num - 1; this._scheduleReflow(); } } get direction() { return this._direction; } set direction(dir) { // Force it to be either horizontal or vertical. dir = (dir === 'horizontal') ? dir : 'vertical'; if (dir !== this._direction) { this._direction = dir; this._sizeDim = (dir === 'horizontal') ? 'width' : 'height'; this._secondarySizeDim = (dir === 'horizontal') ? 'height' : 'width'; this._positionDim = (dir === 'horizontal') ? 'left' : 'top'; this._secondaryPositionDim = (dir === 'horizontal') ? 'top' : 'left'; this._scheduleReflow(); } } get itemSize() { return this._itemSize; } set itemSize(dims) { const {_itemDim1, _itemDim2} = this; Object.assign(this._itemSize, dims); if (_itemDim1 !== this._itemDim1 || _itemDim2 !== this._itemDim2) { if (_itemDim2 !== this._itemDim2) { this._itemDim2Changed(); } else { this._scheduleReflow(); } } } get spacing() { return this._spacing; } set spacing(px) { if (px !== this._spacing) { this._spacing = px; this._scheduleReflow(); } } get viewportSize() { return this._viewportSize; } set viewportSize(dims) { const {_viewDim1, _viewDim2} = this; Object.assign(this._viewportSize, dims); if (_viewDim2 !== this._viewDim2) { this._viewDim2Changed(); } else if (_viewDim1 !== this._viewDim1) { this._checkThresholds(); } } get viewportScroll() { return this._latestCoords; } set viewportScroll(coords) { Object.assign(this._latestCoords, coords); const oldPos = this._scrollPosition; this._scrollPosition = this._latestCoords[this._positionDim]; if (oldPos !== this._scrollPosition) { this._scrollPositionChanged(oldPos, this._scrollPosition); } this._checkThresholds(); } // private properties get _delta() { return this._itemDim1 + this._spacing; } get _itemDim1() { return this._itemSize[this._sizeDim]; } get _itemDim2() { return this._itemSize[this._secondarySizeDim]; } get _viewDim1() { return this._viewportSize[this._sizeDim]; } get _viewDim2() { return this._viewportSize[this._secondarySizeDim]; } get _num() { if (this._first === -1 || this._last === -1) { return 0; } return this._last - this._first + 1; } // public methods reflowIfNeeded() { if (this._pendingReflow) { this._pendingReflow = false; this._reflow(); } } scrollToIndex(index, position = 'start') { if (!Number.isFinite(index)) return; index = Math.min(this.totalItems, Math.max(0, index)); this._scrollToIndex = index; if (position === 'nearest') { position = index > this._first + this._num / 2 ? 'end' : 'start'; } switch (position) { case 'start': this._scrollToAnchor = 0; break; case 'center': this._scrollToAnchor = 0.5; break; case 'end': this._scrollToAnchor = 1; break; default: throw new TypeError( 'position must be one of: start, center, end, nearest'); } this._scheduleReflow(); this.reflowIfNeeded(); } /// _scheduleReflow() { this._pendingReflow = true; } _reflow() { const {_first, _last, _scrollSize} = this; this._updateScrollSize(); this._getActiveItems(); this._scrollIfNeeded(); if (this._scrollSize !== _scrollSize) { this._emitScrollSize(); } if (this._first === -1 && this._last === -1) { this._emitRange(); } else if ( this._first !== _first || this._last !== _last || this._spacingChanged) { this._emitRange(); this._emitChildPositions(); } this._emitScrollError(); } _updateScrollSize() { // Ensure we have at least 1px - this allows getting at least 1 item to be // rendered. this._scrollSize = Math.max(1, this._totalItems * this._delta); } _checkThresholds() { if (this._viewDim1 === 0 && this._num > 0) { this._scheduleReflow(); } else { const min = Math.max(0, this._scrollPosition - this._overhang); const max = Math.min( this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang); if (this._physicalMin > min || this._physicalMax < max) { this._scheduleReflow(); } } } _scrollIfNeeded() { if (this._scrollToIndex === -1) { return; } const index = this._scrollToIndex; const anchor = this._scrollToAnchor; const pos = this._getItemPosition(index)[this._positionDim]; const size = this._getItemSize(index)[this._sizeDim]; const curAnchorPos = this._scrollPosition + this._viewDim1 * anchor; const newAnchorPos = pos + size * anchor; // Ensure scroll position is an integer within scroll bounds. const scrollPosition = Math.floor(Math.min( this._scrollSize - this._viewDim1, Math.max(0, this._scrollPosition - curAnchorPos + newAnchorPos))); this._scrollError += this._scrollPosition - scrollPosition; this._scrollPosition = scrollPosition; } _emitRange(inProps) { const detail = Object.assign( { first: this._first, last: this._last, num: this._num, stable: true, }, inProps); this.dispatchEvent(new CustomEvent('rangechange', {detail})); } _emitScrollSize() { const detail = { [this._sizeDim]: this._scrollSize, }; this.dispatchEvent(new CustomEvent('scrollsizechange', {detail})); } _emitScrollError() { if (this._scrollError) { const detail = { [this._positionDim]: this._scrollError, [this._secondaryPositionDim]: 0, }; this.dispatchEvent(new CustomEvent('scrollerrorchange', {detail})); this._scrollError = 0; } } _emitChildPositions() { const detail = {}; for (let idx = this._first; idx <= this._last; idx++) { detail[idx] = this._getItemPosition(idx); } this.dispatchEvent(new CustomEvent('itempositionchange', {detail})); } _itemDim2Changed() { // Override } _viewDim2Changed() { // Override } _scrollPositionChanged(oldPos, newPos) { // When both values are bigger than the max scroll position, keep the // current _scrollToIndexx, otherwise invalidate it. const maxPos = this._scrollSize - this._viewDim1; if (oldPos < maxPos || newPos < maxPos) { this._scrollToIndex = -1; } } _getActiveItems() { // Override } _getItemPosition(idx) { // Override. } _getItemSize(idx) { // Override. return { [this._sizeDim]: this._itemDim1, [this._secondarySizeDim]: this._itemDim2, }; } }import Layout1dBase from './layout-1d-base.js'; export default class Layout extends Layout1dBase { constructor(config) { super(config); this._rolumns = 1; } updateItemSizes(sizes) { // Assume all items have the same size. const size = Object.values(sizes)[0]; if (size) { this.itemSize = size; } } _viewDim2Changed() { this._defineGrid(); } _itemDim2Changed() { this._defineGrid(); } _getActiveItems() { const min = Math.max(0, this._scrollPosition - this._overhang); const max = Math.min( this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang); const firstCow = Math.floor(min / this._delta); const lastCow = Math.ceil(max / this._delta) - 1; this._first = firstCow * this._rolumns; this._last = Math.min(((lastCow + 1) * this._rolumns) - 1, this._totalItems); this._physicalMin = this._delta * firstCow; this._physicalMax = this._delta * (lastCow + 1); } _getItemPosition(idx) { return { [this._positionDim]: Math.floor(idx / this._rolumns) * this._delta, [this._secondaryPositionDim]: this._spacing + ((idx % this._rolumns) * (this._spacing + this._itemDim2)) } } _defineGrid() { const {_spacing} = this; this._rolumns = Math.max(1, Math.floor(this._viewDim2 / this._itemDim2)); if (this._rolumns > 1) { this._spacing = (this._viewDim2 % (this._rolumns * this._itemDim2)) / (this._rolumns + 1); } this._spacingChanged = !(_spacing === this._spacing); this._scheduleReflow(); } _updateScrollSize() { this._scrollSize = Math.max(1, Math.ceil(this._totalItems / this._rolumns) * this._delta); } }import Layout1dBase from './layout-1d-base.js'; export default class Layout extends Layout1dBase { constructor(config) { super(config); this._physicalItems = new Map(); this._newPhysicalItems = new Map(); this._metrics = new Map(); this._anchorIdx = null; this._anchorPos = null; this._stable = true; this._needsRemeasure = false; this._nMeasured = 0; this._tMeasured = 0; this._estimate = true; } updateItemSizes(sizes) { Object.keys(sizes).forEach((key) => { const metrics = sizes[key], mi = this._getMetrics(key), prevSize = mi[this._sizeDim]; // TODO(valdrin) Handle margin collapsing. // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing mi.width = metrics.width + (metrics.marginLeft || 0) + (metrics.marginRight || 0); mi.height = metrics.height + (metrics.marginTop || 0) + (metrics.marginBottom || 0); const size = mi[this._sizeDim]; const item = this._getPhysicalItem(Number(key)); if (item) { let delta; if (size !== undefined) { item.size = size; if (prevSize === undefined) { delta = size; this._nMeasured++; } else { delta = size - prevSize; } } this._tMeasured = this._tMeasured + delta; } else { // console.debug(`Could not find physical item for key ${key}`); } }); if (!this._nMeasured) { console.warn(`No items measured yet.`); } else { this._updateItemSize(); this._scheduleReflow(); } } _updateItemSize() { // Keep integer values. this._itemSize[this._sizeDim] = Math.round(this._tMeasured / this._nMeasured); } // _getMetrics(idx) { return (this._metrics[idx] = this._metrics[idx] || {}); } _getPhysicalItem(idx) { return this._newPhysicalItems.get(idx) || this._physicalItems.get(idx); } _getSize(idx) { const item = this._getPhysicalItem(idx); return item && item.size; } _getPosition(idx) { const item = this._physicalItems.get(idx); return item ? item.pos : (idx * (this._delta)) + this._spacing; } _calculateAnchor(lower, upper) { if (lower === 0) { return 0; } if (upper > this._scrollSize - this._viewDim1) { return this._maxIdx; } return Math.max( 0, Math.min( this._maxIdx, Math.floor(((lower + upper) / 2) / this._delta))); } _getAnchor(lower, upper) { if (this._physicalItems.size === 0) { return this._calculateAnchor(lower, upper); } if (this._first < 0) { console.error('_getAnchor: negative _first'); return this._calculateAnchor(lower, upper); } if (this._last < 0) { console.error('_getAnchor: negative _last'); return this._calculateAnchor(lower, upper); } const firstItem = this._getPhysicalItem(this._first), lastItem = this._getPhysicalItem(this._last), firstMin = firstItem.pos, firstMax = firstMin + firstItem.size, lastMin = lastItem.pos, lastMax = lastMin + lastItem.size; if (lastMax < lower) { // Window is entirely past physical items, calculate new anchor return this._calculateAnchor(lower, upper); } if (firstMin > upper) { // Window is entirely before physical items, calculate new anchor return this._calculateAnchor(lower, upper); } if (firstMin >= lower || firstMax >= lower) { // First physical item overlaps window, choose it return this._first; } if (lastMax <= upper || lastMin <= upper) { // Last physical overlaps window, choose it return this._last; } // Window contains a physical item, but not the first or last let maxIdx = this._last, minIdx = this._first; while (true) { let candidateIdx = Math.round((maxIdx + minIdx) / 2), candidate = this._physicalItems.get(candidateIdx), cMin = candidate.pos, cMax = cMin + candidate.size; if ((cMin >= lower && cMin <= upper) || (cMax >= lower && cMax <= upper)) { return candidateIdx; } else if (cMax < lower) { minIdx = candidateIdx + 1; } else if (cMin > upper) { maxIdx = candidateIdx - 1; } } } _getActiveItems() { if (this._viewDim1 === 0 || this._totalItems === 0) { this._clearItems(); } else { const upper = Math.min( this._scrollSize, this._scrollPosition + this._viewDim1 + this._overhang), lower = Math.max(0, upper - this._viewDim1 - (2 * this._overhang)); this._getItems(lower, upper); } } _clearItems() { this._first = -1; this._last = -1; this._physicalMin = 0; this._physicalMax = 0; const items = this._newPhysicalItems; this._newPhysicalItems = this._physicalItems; this._newPhysicalItems.clear(); this._physicalItems = items; this._stable = true; } _getItems(lower, upper) { const items = this._newPhysicalItems; // The anchorIdx is the anchor around which we reflow. // It is designed to allow jumping to any point of the scroll size. // We choose it once and stick with it until stable. first and last are // deduced around it. if (this._anchorIdx === null || this._anchorPos === null) { this._anchorIdx = this._getAnchor(lower, upper); this._anchorPos = this._getPosition(this._anchorIdx); } let anchorSize = this._getSize(this._anchorIdx); if (anchorSize === undefined) { anchorSize = this._itemDim1; } // Anchor might be outside bounds, so prefer correcting the error and keep // that anchorIdx. let anchorErr = 0; if (this._anchorPos + anchorSize + this._spacing < lower) { anchorErr = lower - (this._anchorPos + anchorSize + this._spacing); } if (this._anchorPos > upper) { anchorErr = upper - this._anchorPos; } if (anchorErr) { this._scrollPosition -= anchorErr; lower -= anchorErr; upper -= anchorErr; this._scrollError += anchorErr; } items.set(this._anchorIdx, {pos: this._anchorPos, size: anchorSize}); this._first = (this._last = this._anchorIdx); this._physicalMin = (this._physicalMax = this._anchorPos); this._stable = true; while (this._physicalMin > lower && this._first > 0) { let size = this._getSize(--this._first); if (size === undefined) { this._stable = false; size = this._itemDim1; } const pos = (this._physicalMin -= size + this._spacing); items.set(this._first, {pos, size}); if (this._stable === false && this._estimate === false) { break; } } while (this._physicalMax < upper && this._last < this._totalItems) { let size = this._getSize(this._last); if (size === undefined) { this._stable = false; size = this._itemDim1; } items.set(this._last++, {pos: this._physicalMax, size}); if (this._stable === false && this._estimate === false) { break; } else { this._physicalMax += size + this._spacing; } } this._last--; // This handles the cases where we were relying on estimated sizes. const extentErr = this._calculateError(); if (extentErr) { this._physicalMin -= extentErr; this._physicalMax -= extentErr; this._anchorPos -= extentErr; this._scrollPosition -= extentErr; items.forEach(item => item.pos -= extentErr); this._scrollError += extentErr; } if (this._stable) { this._newPhysicalItems = this._physicalItems; this._newPhysicalItems.clear(); this._physicalItems = items; } } _calculateError() { if (this._first === 0) { return this._physicalMin; } else if (this._physicalMin <= 0) { return this._physicalMin - (this._first * this._delta); } else if (this._last === this._maxIdx) { return this._physicalMax - this._scrollSize; } else if (this._physicalMax >= this._scrollSize) { return ( (this._physicalMax - this._scrollSize) + ((this._maxIdx - this._last) * this._delta)); } return 0; } _updateScrollSize() { // Reuse previously calculated physical max, as it might be // higher than the estimated size. super._updateScrollSize(); this._scrollSize = Math.max(this._physicalMax, this._scrollSize); } // TODO: Can this be made to inherit from base, with proper hooks? _reflow() { const {_first, _last, _scrollSize} = this; this._updateScrollSize(); this._getActiveItems(); this._scrollIfNeeded(); if (this._scrollSize !== _scrollSize) { this._emitScrollSize(); } this._emitRange(); if (this._first === -1 && this._last === -1) { this._resetReflowState(); } else if ( this._first !== _first || this._last !== _last || this._needsRemeasure) { this._emitChildPositions(); this._emitScrollError(); } else { this._emitChildPositions(); this._emitScrollError(); this._resetReflowState(); } } _resetReflowState() { this._anchorIdx = null; this._anchorPos = null; this._stable = true; } _getItemPosition(idx) { return { [this._positionDim]: this._getPosition(idx), [this._secondaryPositionDim]: 0 } } _getItemSize(idx) { return { [this._sizeDim]: this._getSize(idx) || this._itemDim1, [this._secondarySizeDim]: this._itemDim2, }; } _viewDim2Changed() { this._needsRemeasure = true; this._scheduleReflow(); } _emitRange() { const remeasure = this._needsRemeasure; const stable = this._stable; this._needsRemeasure = false; super._emitRange({remeasure, stable}); } } import {Repeats} from './virtual-repeater.js'; export class RangeChangeEvent extends Event { constructor(type, init) { super(type, init); this._first = Math.floor(init.first || 0); this._last = Math.floor(init.last || 0); } get first() { return this._first; } get last() { return this._last; } } export const RepeatsAndScrolls = Superclass => class extends Repeats (Superclass) { constructor(config) { super(); this._num = 0; this._first = -1; this._last = -1; this._prevFirst = -1; this._prevLast = -1; this._needsUpdateView = false; this._containerElement = null; this._layout = null; this._scrollTarget = null; // Keep track of original inline style of the container, // so it can be restored when container is changed. this._containerInlineStyle = null; // A sentinel element that sizes the container when // it is a scrolling element. this._sizer = null; // Layout provides these values, we set them on _render(). this._scrollSize = null; this._scrollErr = null; this._childrenPos = null; this._containerSize = null; this._containerRO = new ResizeObserver( (entries) => this._containerSizeChanged(entries[0].contentRect)); this._skipNextChildrenSizeChanged = false; this._childrenRO = new ResizeObserver((entries) => this._childrenSizeChanged(entries)); if (config) { Object.assign(this, config); } } get container() { return this._container; } set container(container) { super.container = container; const oldEl = this._containerElement; // Consider document fragments as shadowRoots. const newEl = (container && container.nodeType === Node.DOCUMENT_FRAGMENT_NODE) ? container.host : container; if (oldEl === newEl) { return; } this._containerRO.disconnect(); this._containerSize = null; if (oldEl) { if (this._containerInlineStyle) { oldEl.setAttribute('style', this._containerInlineStyle); } else { oldEl.removeAttribute('style'); } this._containerInlineStyle = null; if (oldEl === this._scrollTarget) { oldEl.removeEventListener('scroll', this, {passive: true}); this._sizer && this._sizer.remove(); } } else { // First time container was setup, add listeners only now. addEventListener('scroll', this, {passive: true}); } this._containerElement = newEl; if (newEl) { this._containerInlineStyle = newEl.getAttribute('style') || null; if (newEl === this._scrollTarget) { this._sizer = this._sizer || this._createContainerSizer(); this._container.prepend(this._sizer); } this._scheduleUpdateView(); this._containerRO.observe(newEl); } } get layout() { return this._layout; } set layout(layout) { if (layout === this._layout) { return; } if (this._layout) { this._measureCallback = null; this._layout.removeEventListener('scrollsizechange', this); this._layout.removeEventListener('scrollerrorchange', this); this._layout.removeEventListener('itempositionchange', this); this._layout.removeEventListener('rangechange', this); // Reset container size so layout can get correct viewport size. if (this._containerElement) { this._sizeContainer(); } } this._layout = layout; if (this._layout) { if (typeof this._layout.updateItemSizes === 'function') { this._measureCallback = this._layout.updateItemSizes.bind(this._layout); this.requestRemeasure(); } this._layout.addEventListener('scrollsizechange', this); this._layout.addEventListener('scrollerrorchange', this); this._layout.addEventListener('itempositionchange', this); this._layout.addEventListener('rangechange', this); this._scheduleUpdateView(); } } /** * The element that generates scroll events and defines the container * viewport. The value `null` (default) corresponds to `window` as scroll * target. * @type {Element|null} */ get scrollTarget() { return this._scrollTarget; } /** * @param {Element|null} target */ set scrollTarget(target) { // Consider window as null. if (target === window) { target = null; } if (this._scrollTarget === target) { return; } if (this._scrollTarget) { this._scrollTarget.removeEventListener('scroll', this, {passive: true}); if (this._sizer && this._scrollTarget === this._containerElement) { this._sizer.remove(); } } this._scrollTarget = target; if (target) { target.addEventListener('scroll', this, {passive: true}); if (target === this._containerElement) { this._sizer = this._sizer || this._createContainerSizer(); this._container.prepend(this._sizer); } } } /** * @protected */ _render() { // console.time(`render ${this._containerElement.localName}#${ // this._containerElement.id}`); this._childrenRO.disconnect(); // Update layout properties before rendering to have correct // first, num, scroll size, children positions. this._layout.totalItems = this.totalItems; if (this._needsUpdateView) { this._needsUpdateView = false; this._updateView(); } this._layout.reflowIfNeeded(); // Keep rendering until there is no more scheduled renders. while (true) { if (this._pendingRender) { cancelAnimationFrame(this._pendingRender); this._pendingRender = null; } // Update scroll size and correct scroll error before rendering. this._sizeContainer(this._scrollSize); if (this._scrollErr) { // This triggers a 'scroll' event (async) which triggers another // _updateView(). this._correctScrollError(this._scrollErr); this._scrollErr = null; } // Position children (_didRender()), and provide their measures to layout. super._render(); this._layout.reflowIfNeeded(); // If layout reflow did not provoke another render, we're done. if (!this._pendingRender) { break; } } // We want to skip the first ResizeObserver callback call as we already // measured the children. this._skipNextChildrenSizeChanged = true; this._kids.forEach(child => this._childrenRO.observe(child)); // console.timeEnd(`render ${this._containerElement.localName}#${ // this._containerElement.id}`); } /** * Position children before they get measured. * Measuring will force relayout, so by positioning * them first, we reduce computations. * @protected */ _didRender() { if (this._childrenPos) { this._positionChildren(this._childrenPos); this._childrenPos = null; } } /** * @param {!Event} event * @private */ handleEvent(event) { switch (event.type) { case 'scroll': if (!this._scrollTarget || event.target === this._scrollTarget) { this._scheduleUpdateView(); } break; case 'scrollsizechange': this._scrollSize = event.detail; this._scheduleRender(); break; case 'scrollerrorchange': this._scrollErr = event.detail; this._scheduleRender(); break; case 'itempositionchange': this._childrenPos = event.detail; this._scheduleRender(); break; case 'rangechange': this._adjustRange(event.detail); break; default: console.warn('event not handled', event); } } /** * @return {!Element} * @private */ _createContainerSizer() { const sizer = document.createElement('div'); // When the scrollHeight is large, the height // of this element might be ignored. // Setting content and font-size ensures the element // has a size. Object.assign(sizer.style, { position: 'absolute', margin: '-2px 0 0 0', padding: 0, visibility: 'hidden', fontSize: '2px', }); sizer.innerHTML = ' '; return sizer; } // Rename _ordered to _kids? /** * @protected */ get _kids() { return this._ordered; } /** * @private */ _scheduleUpdateView() { this._needsUpdateView = true; this._scheduleRender(); } /** * @private */ _updateView() { let width, height, top, left; if (this._scrollTarget === this._containerElement) { width = this._containerSize.width; height = this._containerSize.height; left = this._containerElement.scrollLeft; top = this._containerElement.scrollTop; } else { const containerBounds = this._containerElement.getBoundingClientRect(); const scrollBounds = this._scrollTarget ? this._scrollTarget.getBoundingClientRect() : {top: 0, left: 0, width: innerWidth, height: innerHeight}; const scrollerWidth = scrollBounds.width; const scrollerHeight = scrollBounds.height; const xMin = Math.max( 0, Math.min(scrollerWidth, containerBounds.left - scrollBounds.left)); const yMin = Math.max( 0, Math.min(scrollerHeight, containerBounds.top - scrollBounds.top)); const xMax = this._layout.direction === 'vertical' ? Math.max( 0, Math.min( scrollerWidth, containerBounds.right - scrollBounds.left)) : scrollerWidth; const yMax = this._layout.direction === 'vertical' ? scrollerHeight : Math.max( 0, Math.min( scrollerHeight, containerBounds.bottom - scrollBounds.top)); width = xMax - xMin; height = yMax - yMin; left = Math.max(0, -(containerBounds.x - scrollBounds.left)); top = Math.max(0, -(containerBounds.y - scrollBounds.top)); } this._layout.viewportSize = {width, height}; this._layout.viewportScroll = {top, left}; } /** * @private */ _sizeContainer(size) { if (this._scrollTarget === this._containerElement) { const left = size && size.width ? size.width - 1 : 0; const top = size && size.height ? size.height - 1 : 0; this._sizer.style.transform = `translate(${left}px, ${top}px)`; } else { const style = this._containerElement.style; style.minWidth = size && size.width ? size.width + 'px' : null; style.minHeight = size && size.height ? size.height + 'px' : null; } } /** * @private */ _positionChildren(pos) { const kids = this._kids; Object.keys(pos).forEach(key => { const idx = key - this._first; const child = kids[idx]; if (child) { const {top, left} = pos[key]; // console.debug(`_positionChild #${this._container.id} > // #${child.id}: top ${top}`); child.style.position = 'absolute'; child.style.transform = `translate(${left}px, ${top}px)`; } }); } /** * @private */ _adjustRange(range) { this.num = range.num; this.first = range.first; this._incremental = !(range.stable); if (range.remeasure) { this.requestRemeasure(); } else if (range.stable) { this._notifyStable(); } } /** * @protected */ _shouldRender() { if (!super._shouldRender() || !this._layout) { return false; } // NOTE: we're about to render, but the ResizeObserver didn't execute yet. // Since we want to keep rAF timing, we compute _containerSize now. // Would be nice to have a way to flush ResizeObservers if (this._containerSize === null) { const {width, height} = this._containerElement.getBoundingClientRect(); this._containerSize = {width, height}; } return this._containerSize.width > 0 || this._containerSize.height > 0; } /** * @private */ _correctScrollError(err) { if (this._scrollTarget) { this._scrollTarget.scrollTop -= err.top; this._scrollTarget.scrollLeft -= err.left; } else { window.scroll(window.scrollX - err.left, window.scrollY - err.top); } } /** * @protected */ _notifyStable() { const {first, num} = this; const last = first + num - 1; this._container.dispatchEvent( new RangeChangeEvent('rangechange', {first, last})); } /** * @private */ _containerSizeChanged(size) { const {width, height} = size; this._containerSize = {width, height}; // console.debug('container changed size', this._containerSize); this._scheduleUpdateView(); } /** * @private */ _childrenSizeChanged() { if (this._skipNextChildrenSizeChanged) { this._skipNextChildrenSizeChanged = false; } else { this.requestRemeasure(); } } }; export const VirtualScroller = RepeatsAndScrolls(class {}); export const Repeats = Superclass => class extends Superclass { constructor(config) { super(); this._createElementFn = null; this._updateElementFn = null; this._recycleElementFn = null; this._elementKeyFn = null; this._measureCallback = null; this._totalItems = 0; // Consider renaming this. firstVisibleIndex? this._first = 0; // Consider renaming this. count? visibleElements? this._num = Infinity; this.__incremental = false; // used only internally.. // legacy from 1st approach to preact integration this._manageDom = true; // used to check if it is more perf if you don't care of dom order? this._maintainDomOrder = true; this._last = 0; this._prevFirst = 0; this._prevLast = 0; this._needsReset = false; this._needsRemeasure = false; this._pendingRender = null; // Contains child nodes in the rendered order. this._ordered = []; // this._pool = []; this._active = new Map(); this._prevActive = new Map(); // Both used for recycling purposes. this._keyToChild = new Map(); this._childToKey = new WeakMap(); // Used to keep track of measures by index. this._indexToMeasure = {}; // Used to debounce _measureChildren calls. this._measuringId = -1; if (config) { Object.assign(this, config); } } // API get container() { return this._container; } set container(container) { if (container === this._container) { return; } if (this._container) { // Remove children from old container. this._ordered.forEach((child) => this._removeChild(child)); } this._container = container; if (container) { // Insert children in new container. this._ordered.forEach((child) => this._insertBefore(child, null)); } else { this._ordered.length = 0; this._active.clear(); this._prevActive.clear(); } this.requestReset(); } get createElement() { return this._createElementFn; } set createElement(fn) { if (fn !== this._createElementFn) { this._createElementFn = fn; this._keyToChild.clear(); this.requestReset(); } } get updateElement() { return this._updateElementFn; } set updateElement(fn) { if (fn !== this._updateElementFn) { this._updateElementFn = fn; this.requestReset(); } } get recycleElement() { return this._recycleElementFn; } set recycleElement(fn) { if (fn !== this._recycleElementFn) { this._recycleElementFn = fn; this.requestReset(); } } get elementKey() { return this._elementKeyFn; } set elementKey(fn) { if (fn !== this._elementKeyFn) { this._elementKeyFn = fn; this._keyToChild.clear(); this.requestReset(); } } get first() { return this._first; } set first(idx) { if (typeof idx === 'number') { const newFirst = Math.max(0, Math.min(idx, this._totalItems - this._num)); if (newFirst !== this._first) { this._first = newFirst; this._scheduleRender(); } } } get num() { return this._num; } set num(n) { if (typeof n === 'number') { if (n !== this._num) { this._num = n; this.first = this._first; this._scheduleRender(); } } } get totalItems() { return this._totalItems; } set totalItems(num) { // TODO(valdrin) should we check if it is a finite number? // Technically, Infinity would break Layout, not VirtualRepeater. if (typeof num === 'number' && num !== this._totalItems) { this._totalItems = num; this.first = this._first; this.requestReset(); } } get _incremental() { return this.__incremental; } set _incremental(inc) { if (inc !== this.__incremental) { this.__incremental = inc; this._scheduleRender(); } } requestReset() { this._needsReset = true; this._scheduleRender(); } requestRemeasure() { this._needsRemeasure = true; this._scheduleRender(); } // Core functionality /** * @protected */ _shouldRender() { return Boolean(this.container && this.createElement); } /** * @private */ _scheduleRender() { if (!this._pendingRender) { this._pendingRender = requestAnimationFrame(() => { this._pendingRender = null; if (this._shouldRender()) { this._render(); } }); } } /** * Returns those children that are about to be displayed and that * require to be positioned. If reset or remeasure has been triggered, * all children are returned. * @return {{indices:Array,children:Array}} * @private */ get _toMeasure() { return this._ordered.reduce((toMeasure, c, i) => { const idx = this._first + i; if (this._needsReset || this._needsRemeasure || idx < this._prevFirst || idx > this._prevLast) { toMeasure.indices.push(idx); toMeasure.children.push(c); } return toMeasure; }, {indices: [], children: []}); } /** * Measures each child bounds and builds a map of index/bounds to be passed to * the `_measureCallback` * @private */ _measureChildren({indices, children}) { let pm = children.map( (c, i) => this._indexToMeasure[indices[i]] || this._measureChild(c)); const mm = /** @type {{ number: { width: number, height: number } }} */ (pm.reduce((out, cur, i) => { out[indices[i]] = this._indexToMeasure[indices[i]] = cur; return out; }, {})); this._measureCallback(mm); } /** * @protected */ _render() { const rangeChanged = this._first !== this._prevFirst || this._num !== this._prevNum; // Create/update/recycle DOM. if (rangeChanged || this._needsReset) { this._last = this._first + Math.min(this._num, this._totalItems - this._first) - 1; if (this._num || this._prevNum) { if (this._needsReset) { this._reset(this._first, this._last); } else { this._discardHead(); this._discardTail(); this._addHead(); this._addTail(); } } } if (this._needsRemeasure || this._needsReset) { this._indexToMeasure = {}; } // Retrieve DOM to be measured. // Do it right before cleanup and reset of properties. const shouldMeasure = this._num > 0 && this._measureCallback && (rangeChanged || this._needsRemeasure || this._needsReset); const toMeasure = shouldMeasure ? this._toMeasure : null; // Cleanup. if (!this._incremental) { this._prevActive.forEach((idx, child) => this._unassignChild(child, idx)); this._prevActive.clear(); } // Reset internal properties. this._prevFirst = this._first; this._prevLast = this._last; this._prevNum = this._num; this._needsReset = false; this._needsRemeasure = false; // Notify render completed. this._didRender(); // Measure DOM. if (toMeasure) { this._measureChildren(toMeasure); } } /** * Invoked after DOM is updated, and before it gets measured. * @protected */ _didRender() { } /** * @private */ _discardHead() { const o = this._ordered; for (let idx = this._prevFirst; o.length && idx < this._first; idx++) { this._unassignChild(o.shift(), idx); } } /** * @private */ _discardTail() { const o = this._ordered; for (let idx = this._prevLast; o.length && idx > this._last; idx--) { this._unassignChild(o.pop(), idx); } } /** * @private */ _addHead() { const start = this._first; const end = Math.min(this._last, this._prevFirst - 1); for (let idx = end; idx >= start; idx--) { const child = this._assignChild(idx); if (this._manageDom) { if (this._maintainDomOrder || !this._childIsAttached(child)) { this._insertBefore(child, this._firstChild); } } if (this.updateElement) { this.updateElement(child, idx); } this._ordered.unshift(child); } } /** * @private */ _addTail() { const start = Math.max(this._first, this._prevLast + 1); const end = this._last; for (let idx = start; idx <= end; idx++) { const child = this._assignChild(idx); if (this._manageDom) { if (this._maintainDomOrder || !this._childIsAttached(child)) { this._insertBefore(child, null); } } if (this.updateElement) { this.updateElement(child, idx); } this._ordered.push(child); } } /** * @param {number} first * @param {number} last * @private */ _reset(first, last) { const len = last - first + 1; // Explain why swap prevActive with active - affects _assignChild. const prevActive = this._active; this._active = this._prevActive; this._prevActive = prevActive; let currentMarker = this._manageDom && this._firstChild; this._ordered.length = 0; for (let n = 0; n < len; n++) { const idx = first + n; const child = this._assignChild(idx); this._ordered.push(child); if (this._manageDom) { if (currentMarker && this._maintainDomOrder) { if (currentMarker === this._node(child)) { currentMarker = this._nextSibling(child); } else { this._insertBefore(child, currentMarker); } } else if (!this._childIsAttached(child)) { this._insertBefore(child, null); } } if (this.updateElement) { this.updateElement(child, idx); } } } /** * @param {number} idx * @private */ _assignChild(idx) { const key = this.elementKey ? this.elementKey(idx) : idx; let child; if (child = this._keyToChild.get(key)) { this._prevActive.delete(child); } else { child = this.createElement(idx); this._keyToChild.set(key, child); this._childToKey.set(child, key); } this._showChild(child); this._active.set(child, idx); return child; } /** * @param {*} child * @param {number} idx * @private */ _unassignChild(child, idx) { this._hideChild(child); if (this._incremental) { this._active.delete(child); this._prevActive.set(child, idx); } else { const key = this._childToKey.get(child); this._childToKey.delete(child); this._keyToChild.delete(key); this._active.delete(child); if (this.recycleElement) { this.recycleElement(child, idx); } else if (this._node(child).parentNode) { this._removeChild(child); } } } // TODO: Is this the right name? /** * @private */ get _firstChild() { return this._ordered.length && this._childIsAttached(this._ordered[0]) ? this._node(this._ordered[0]) : null; } // Overridable abstractions for child manipulation /** * @protected */ _node(child) { return child; } /** * @protected */ _nextSibling(child) { return child.nextSibling; } /** * @protected */ _insertBefore(child, referenceNode) { this._container.insertBefore(child, referenceNode); } /** * @protected */ _childIsAttached(child) { const node = this._node(child); return node && node.parentNode === this._container; } /** * @protected */ _hideChild(child) { if (child.style) { child.style.display = 'none'; } } /** * @protected */ _showChild(child) { if (child.style) { child.style.display = null; } } /** * * @param {!Element} child * @return {{width: number, height: number, marginTop: number, marginBottom: number, marginLeft: number, marginRight: number}} childMeasures * @protected */ _measureChild(child) { // offsetWidth doesn't take transforms in consideration, // so we use getBoundingClientRect which does. const {width, height} = child.getBoundingClientRect(); // console.debug(`_measureChild #${this._container.id} > #${ // child.id}: height: ${height}px`); return Object.assign({width, height}, getMargins(child)); } /** * Remove child. * Override to control child removal. * * @param {*} child * @protected */ _removeChild(child) { child.parentNode.removeChild(child); } } function getMargins(el) { const style = window.getComputedStyle(el); // console.log(el.id, style.position); return { marginLeft: getMarginValue(style.marginLeft), marginRight: getMarginValue(style.marginRight), marginTop: getMarginValue(style.marginTop), marginBottom: getMarginValue(style.marginBottom), }; } function getMarginValue(value) { value = value ? parseFloat(value) : NaN; return value !== value ? 0 : value; } export const VirtualRepeater = Repeats(class {});// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Note: vulcanize sometimes disables GRIT processing. If you're importing i18n // stuff with , you should probably be using // html/i18n_template.html instead of this file. // // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** @typedef {Document|DocumentFragment|Element} */ var ProcessingRoot; /** * @fileoverview This is a simple template engine inspired by JsTemplates * optimized for i18n. * * It currently supports three handlers: * * * i18n-content which sets the textContent of the element. * * * * * i18n-options which generates