Procházet zdrojové kódy

feat(spry): add SSE continuation support for components

Add Server-Sent Events (SSE) continuation support enabling real-time
updates in Spry components. Components can now use the spry-continuation
attribute to establish SSE connections.

Changes:
- Add ContinuationProvider for generating SSE endpoint paths
- Add continuation() method to Component base class for stream handling
- Include htmx-sse extension as bundled static resource
- Process spry-continuation attributes during component rendering
- Fix typo in spry-mkssr meson build (missing variable prefix)
Billy Barrow před 1 týdnem
rodič
revize
c801b2d106

+ 2 - 1
generate-static-resources.sh

@@ -1,4 +1,5 @@
 #!/bin/bash
 
 cd src/Static
-spry-mkssr Sources/htmx.min.js -n htmx.js --vala --ns Spry.Static
+spry-mkssr Sources/htmx.min.js -n htmx.js --vala --ns Spry.Static
+spry-mkssr Sources/htmx-sse.min.js -n htmx-sse.js --vala --ns Spry.Static

+ 12 - 0
src/Component.vala

@@ -20,8 +20,12 @@ namespace Spry {
         public virtual async void handle_action(string action) throws Error {
             // No-op default
         }
+        public virtual async void continuation(SseStream stream) throws Error {
+            // No-op default
+        }
         
         private PathProvider _path_provider = inject<PathProvider>();
+        private ContinuationProvider _continuation_provider = inject<ContinuationProvider>();
         private Catalogue<string, Renderable> _children = new Catalogue<string, Renderable>();
         private HashSet<Component> _global_sources = new HashSet<Component>();
         private MarkupDocument _instance;
@@ -165,6 +169,14 @@ namespace Spry {
                 node.remove_attribute("spry-res");
             }
 
+            var continuation_nodes = final_instance.select("//*[@spry-continuation]");
+            foreach(var node in continuation_nodes) {
+                var path = _continuation_provider.get_continuation_path(this);
+                node.set_attribute("hx-ext", "sse");
+                node.set_attribute("sse-connect", path);
+                node.remove_attribute("spry-continuation");
+            }
+
             // Remove all internal SIDs
             final_instance.select("//*[@sid]")
                 .iterate(n => n.remove_attribute("sid"));

+ 69 - 0
src/ContinuationProvider.vala

@@ -0,0 +1,69 @@
+using Astralis;
+using Invercargill.DataStructures;
+using Inversion;
+namespace Spry {
+
+    public class ContinuationProvider : SseEndpoint {
+
+        private Dictionary<string, Component> components = new Dictionary<string, Component>();
+        private Dictionary<string, bool> active_channels = new Dictionary<string, bool>();
+
+        public override uint retry_interval { get { return 500; } }
+
+        public async override void new_connection(HttpContext http_context, RouteContext route_context, SseStream stream) {
+            var continuation_id = route_context.mapped_parameters.get_or_default("token");
+            Component component = null;
+            lock(active_channels) {
+                if(components.try_get(continuation_id, out component)) {
+                    active_channels[continuation_id] = true;
+                }
+            }
+
+            try {
+                if(component == null) {
+                        yield stream.send_event(new SseEvent.with_type("_spry-close", "404"));
+                }
+
+                try {
+                    yield component.continuation(stream);
+                }
+                catch(Error e) {
+                    warning(@"Component $(component.get_type().name()) threw exception in follow up: $(e.message)");
+                    yield stream.send_event(new SseEvent.with_type("_spry-close", "500"));
+                }
+                yield stream.send_event(new SseEvent.with_type("_spry-close", "200"));
+            }
+            catch(Error e) {
+                warning("Failed to send '_spry-close' event: " + e.message);
+                return;
+            }
+
+        }
+        
+        public string get_continuation_path(Component component) {
+            var id = Uuid.string_random();
+            components[id] = component;
+            active_channels[id] = false;
+
+            // Remove component after 60 seconds if no connection has been made
+            Timeout.add_seconds_once(60, () => clean(id));
+            return @"/_spry/cnu/$id";
+        }
+
+        private void clean(string id) {
+            bool active;
+            lock(active_channels){
+                if(!active_channels.try_get(id, out active)) {
+                    components.remove(id);
+                    return;
+                }
+                if(!active) {
+                    components.remove(id);
+                    active_channels.remove(id);
+                }
+            }
+        }
+
+    }
+
+}

+ 3 - 0
src/Spry.vala

@@ -9,6 +9,7 @@ namespace Spry {
             container.register_startup<StaticResourceProvider>()
                 .as<Endpoint>()
                 .with_metadata<EndpointRoute>(new EndpointRoute("/_spry/res/{resource}"));
+
             container.register_scoped<ComponentFactory>();
             container.register_scoped<ComponentEndpoint>()
                 .as<Endpoint>()
@@ -16,6 +17,8 @@ namespace Spry {
 
             container.register_startup<Static.HtmxResource>()
                 .as<Spry.StaticResource>();
+            container.register_startup<Static.HtmxSseResource>()
+                .as<Spry.StaticResource>();
         }
 
     }

+ 415 - 0
src/Static/HtmxSseResource.vala

@@ -0,0 +1,415 @@
+using Spry;
+using Invercargill;
+
+namespace Spry.Static {
+
+    // Generated by spry-mkssr
+    public class HtmxSseResource : ConstantStaticResource {
+
+        public override string name { get { return "htmx-sse.js"; } }
+        public override string file_hash { get { return "8357797afa6479580d65394c88ad347b793cdce0541da5eba62f9f617e80fee575287b4056c430f03855bc453a17d64e255fdcb8a2e5aacf9dc6d439e8a23545"; } }
+        public override string content_type { get { return "text/javascript"; } }
+
+        public override string get_best_encoding(Set<string> supported) {
+            if (supported.has("br")) return "br";
+            if (supported.has("zstd")) return "zstd";
+            if (supported.has("gzip")) return "gzip";
+            return "identity";
+        }
+
+        public override unowned uint8[] get_encoding(string encoding) {
+            switch (encoding) {
+                case "identity": return IDENTITY_DATA;
+                case "gzip": return GZIP_DATA;
+                case "zstd": return ZSTD_DATA;
+                case "br": return BR_DATA;
+                default: return IDENTITY_DATA;
+            }
+        }
+
+        private const uint8[] IDENTITY_DATA = {
+            0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20,
+            0x67, 0x3b, 0x68, 0x74, 0x6d, 0x78, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x45, 0x78, 0x74,
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x22, 0x73, 0x73, 0x65, 0x22, 0x2c, 0x7b, 0x69, 0x6e,
+            0x69, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x67,
+            0x3d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x68, 0x74, 0x6d, 0x78, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74,
+            0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x3d, 0x75, 0x6e,
+            0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x7b, 0x68, 0x74, 0x6d, 0x78, 0x2e, 0x63, 0x72,
+            0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d,
+            0x74, 0x7d, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73,
+            0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75,
+            0x72, 0x6e, 0x5b, 0x22, 0x5b, 0x73, 0x73, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
+            0x5d, 0x22, 0x2c, 0x22, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x73, 0x65, 0x2d, 0x63, 0x6f,
+            0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5d, 0x22, 0x2c, 0x22, 0x5b, 0x73, 0x73, 0x65, 0x2d, 0x73, 0x77,
+            0x61, 0x70, 0x5d, 0x22, 0x2c, 0x22, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x73, 0x65, 0x2d,
+            0x73, 0x77, 0x61, 0x70, 0x5d, 0x22, 0x5d, 0x7d, 0x2c, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74,
+            0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x2c, 0x74, 0x29, 0x7b, 0x76,
+            0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x7c, 0x7c, 0x74,
+            0x2e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x2e, 0x65, 0x6c, 0x74, 0x3b, 0x73, 0x77, 0x69, 0x74,
+            0x63, 0x68, 0x28, 0x65, 0x29, 0x7b, 0x63, 0x61, 0x73, 0x65, 0x22, 0x68, 0x74, 0x6d, 0x78, 0x3a,
+            0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x45, 0x6c, 0x65,
+            0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x67, 0x2e, 0x67, 0x65,
+            0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x72, 0x29,
+            0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x6e, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e,
+            0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x29, 0x7b, 0x67, 0x2e,
+            0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x72, 0x2c, 0x22,
+            0x68, 0x74, 0x6d, 0x78, 0x3a, 0x73, 0x73, 0x65, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x7b,
+            0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x73, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e,
+            0x6f, 0x64, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x22, 0x7d, 0x29, 0x3b, 0x6e,
+            0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,
+            0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x63,
+            0x61, 0x73, 0x65, 0x22, 0x68, 0x74, 0x6d, 0x78, 0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x50, 0x72,
+            0x6f, 0x63, 0x65, 0x73, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x69, 0x28, 0x72, 0x29, 0x7d,
+            0x7d, 0x7d, 0x29, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x28, 0x65,
+            0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x76, 0x65,
+            0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x65, 0x2c, 0x7b, 0x77, 0x69, 0x74, 0x68,
+            0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x3a, 0x74, 0x72, 0x75, 0x65,
+            0x7d, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x28, 0x6e, 0x29,
+            0x7b, 0x69, 0x66, 0x28, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+            0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x2c, 0x22, 0x73, 0x73, 0x65, 0x2d, 0x73,
+            0x77, 0x61, 0x70, 0x22, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x67, 0x2e, 0x67,
+            0x65, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e,
+            0x2c, 0x76, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7b,
+            0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x76, 0x61, 0x72, 0x20,
+            0x65, 0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44,
+            0x61, 0x74, 0x61, 0x28, 0x73, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x65, 0x2e, 0x73,
+            0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3b, 0x76, 0x61,
+            0x72, 0x20, 0x74, 0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+            0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x2c, 0x22, 0x73, 0x73, 0x65, 0x2d, 0x73,
+            0x77, 0x61, 0x70, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x73, 0x70,
+            0x6c, 0x69, 0x74, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72,
+            0x20, 0x69, 0x3d, 0x30, 0x3b, 0x69, 0x3c, 0x72, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b,
+            0x69, 0x2b, 0x2b, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x3d, 0x72, 0x5b, 0x69,
+            0x5d, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63,
+            0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28,
+            0x6c, 0x28, 0x73, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28,
+            0x21, 0x67, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28,
+            0x6e, 0x29, 0x29, 0x7b, 0x61, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e,
+            0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x75, 0x2c, 0x63, 0x29, 0x3b, 0x72,
+            0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x21, 0x67, 0x2e, 0x74, 0x72, 0x69, 0x67,
+            0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x22, 0x68, 0x74, 0x6d, 0x78,
+            0x3a, 0x73, 0x73, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+            0x65, 0x22, 0x2c, 0x65, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x66, 0x28,
+            0x6e, 0x2c, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x67, 0x2e, 0x74, 0x72, 0x69, 0x67,
+            0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x22, 0x68, 0x74, 0x6d, 0x78,
+            0x3a, 0x73, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x65, 0x29, 0x7d,
+            0x3b, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61,
+            0x74, 0x61, 0x28, 0x6e, 0x29, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69,
+            0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3d, 0x63, 0x3b, 0x61, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76,
+            0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x75, 0x2c, 0x63, 0x29,
+            0x7d, 0x7d, 0x69, 0x66, 0x28, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+            0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x2c, 0x22, 0x68, 0x78, 0x2d, 0x74,
+            0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d,
+            0x67, 0x2e, 0x67, 0x65, 0x74, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63,
+            0x68, 0x28, 0x6e, 0x2c, 0x76, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x73, 0x3d, 0x3d, 0x6e, 0x75, 0x6c,
+            0x6c, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x76,
+            0x61, 0x72, 0x20, 0x65, 0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+            0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x73, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d,
+            0x65, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
+            0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x72, 0x69, 0x67,
+            0x67, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x73, 0x28, 0x6e, 0x29, 0x3b, 0x6f, 0x2e, 0x66, 0x6f,
+            0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74,
+            0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x73,
+            0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x34, 0x29, 0x21, 0x3d, 0x3d, 0x22, 0x73, 0x73, 0x65,
+            0x3a, 0x22, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72,
+            0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28,
+            0x6c, 0x28, 0x73, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28,
+            0x21, 0x67, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28,
+            0x6e, 0x29, 0x29, 0x7b, 0x61, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e,
+            0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x74, 0x2e, 0x74, 0x72, 0x69, 0x67,
+            0x67, 0x65, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x34, 0x29, 0x2c, 0x72, 0x29, 0x7d,
+            0x68, 0x74, 0x6d, 0x78, 0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x74,
+            0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2c, 0x65, 0x29, 0x3b, 0x68, 0x74, 0x6d, 0x78,
+            0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x22, 0x68, 0x74, 0x6d, 0x78,
+            0x3a, 0x73, 0x73, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x65, 0x29, 0x7d,
+            0x3b, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61,
+            0x74, 0x61, 0x28, 0x6e, 0x29, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69,
+            0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3d, 0x72, 0x3b, 0x61, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76,
+            0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x74, 0x2e, 0x74, 0x72,
+            0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x34, 0x29, 0x2c, 0x72,
+            0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28,
+            0x65, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x65, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29,
+            0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x7d, 0x69, 0x66, 0x28,
+            0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61,
+            0x6c, 0x75, 0x65, 0x28, 0x65, 0x2c, 0x22, 0x73, 0x73, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+            0x63, 0x74, 0x22, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x67, 0x2e, 0x67, 0x65,
+            0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28,
+            0x65, 0x2c, 0x22, 0x73, 0x73, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x29,
+            0x3b, 0x69, 0x66, 0x28, 0x72, 0x3d, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x7b, 0x72, 0x65, 0x74,
+            0x75, 0x72, 0x6e, 0x7d, 0x6e, 0x28, 0x65, 0x2c, 0x72, 0x2c, 0x74, 0x29, 0x7d, 0x61, 0x28, 0x65,
+            0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x72, 0x2c, 0x65,
+            0x2c, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x68, 0x74, 0x6d, 0x78, 0x2e, 0x63,
+            0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
+            0x28, 0x65, 0x29, 0x3b, 0x73, 0x2e, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3d, 0x66, 0x75,
+            0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x67, 0x2e, 0x74, 0x72, 0x69, 0x67,
+            0x67, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x72, 0x2c,
+            0x22, 0x68, 0x74, 0x6d, 0x78, 0x3a, 0x73, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c,
+            0x7b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x65, 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a,
+            0x73, 0x7d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6c, 0x28, 0x72, 0x29, 0x29, 0x7b, 0x72, 0x65, 0x74,
+            0x75, 0x72, 0x6e, 0x7d, 0x69, 0x66, 0x28, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74,
+            0x61, 0x74, 0x65, 0x3d, 0x3d, 0x3d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63,
+            0x65, 0x2e, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x29, 0x7b, 0x6e, 0x3d, 0x6e, 0x7c, 0x7c, 0x30,
+            0x3b, 0x6e, 0x3d, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x4d, 0x61, 0x74, 0x68,
+            0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6e, 0x2a, 0x32, 0x2c, 0x31, 0x32, 0x38, 0x29, 0x2c, 0x31, 0x29,
+            0x3b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2a, 0x35, 0x30, 0x30, 0x3b, 0x77, 0x69, 0x6e,
+            0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x66,
+            0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x28, 0x72, 0x2c, 0x6e, 0x29,
+            0x7d, 0x2c, 0x74, 0x29, 0x7d, 0x7d, 0x3b, 0x73, 0x2e, 0x6f, 0x6e, 0x6f, 0x70, 0x65, 0x6e, 0x3d,
+            0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x67, 0x2e, 0x74, 0x72,
+            0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x72, 0x2c, 0x22, 0x68, 0x74,
+            0x6d, 0x78, 0x3a, 0x73, 0x73, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x7b, 0x73, 0x6f, 0x75,
+            0x72, 0x63, 0x65, 0x3a, 0x73, 0x7d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x6e, 0x26, 0x26, 0x6e, 0x3e,
+            0x30, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x3d, 0x72, 0x2e, 0x71, 0x75, 0x65,
+            0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x28, 0x22, 0x5b,
+            0x73, 0x73, 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x5d, 0x2c, 0x20, 0x5b, 0x64, 0x61, 0x74, 0x61,
+            0x2d, 0x73, 0x73, 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x5d, 0x2c, 0x20, 0x5b, 0x68, 0x78, 0x2d,
+            0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5d, 0x2c, 0x20, 0x5b, 0x64, 0x61, 0x74, 0x61, 0x2d,
+            0x68, 0x78, 0x2d, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5d, 0x22, 0x29, 0x3b, 0x66, 0x6f,
+            0x72, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x3d, 0x30, 0x3b, 0x65, 0x3c, 0x74, 0x2e, 0x6c, 0x65,
+            0x6e, 0x67, 0x74, 0x68, 0x3b, 0x65, 0x2b, 0x2b, 0x29, 0x7b, 0x61, 0x28, 0x74, 0x5b, 0x65, 0x5d,
+            0x29, 0x7d, 0x6e, 0x3d, 0x30, 0x7d, 0x7d, 0x3b, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74,
+            0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x72, 0x29, 0x2e, 0x73, 0x73, 0x65,
+            0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x73, 0x3b, 0x76, 0x61,
+            0x72, 0x20, 0x74, 0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+            0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x72, 0x2c, 0x22, 0x73, 0x73, 0x65, 0x2d, 0x63,
+            0x6c, 0x6f, 0x73, 0x65, 0x22, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x29, 0x7b, 0x73, 0x2e, 0x61,
+            0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28,
+            0x74, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x67, 0x2e, 0x74,
+            0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, 0x72, 0x2c, 0x22, 0x68,
+            0x74, 0x6d, 0x78, 0x3a, 0x73, 0x73, 0x65, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x7b, 0x73,
+            0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x73, 0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6d, 0x65,
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7d, 0x29, 0x3b, 0x73, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65,
+            0x28, 0x29, 0x7d, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c,
+            0x28, 0x65, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x67, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x43, 0x6f,
+            0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28, 0x65, 0x29, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74,
+            0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x61,
+            0x74, 0x61, 0x28, 0x65, 0x29, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f,
+            0x75, 0x72, 0x63, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x74, 0x21, 0x3d, 0x75, 0x6e, 0x64, 0x65, 0x66,
+            0x69, 0x6e, 0x65, 0x64, 0x29, 0x7b, 0x67, 0x2e, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x45,
+            0x76, 0x65, 0x6e, 0x74, 0x28, 0x65, 0x2c, 0x22, 0x68, 0x74, 0x6d, 0x78, 0x3a, 0x73, 0x73, 0x65,
+            0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x7b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3a, 0x74,
+            0x2c, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x69, 0x73, 0x73, 0x69,
+            0x6e, 0x67, 0x22, 0x7d, 0x29, 0x3b, 0x74, 0x2e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x3b,
+            0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x7d, 0x7d, 0x72, 0x65, 0x74,
+            0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
+            0x6f, 0x6e, 0x20, 0x66, 0x28, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x67, 0x2e, 0x77, 0x69, 0x74, 0x68,
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x74, 0x2c, 0x66, 0x75, 0x6e,
+            0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x72, 0x3d, 0x65, 0x2e, 0x74, 0x72, 0x61,
+            0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x72,
+            0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x65,
+            0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66,
+            0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6e,
+            0x3d, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x74, 0x29, 0x3b,
+            0x67, 0x2e, 0x73, 0x77, 0x61, 0x70, 0x28, 0x6e, 0x2c, 0x72, 0x2c, 0x65, 0x2c, 0x7b, 0x63, 0x6f,
+            0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x74, 0x7d, 0x29,
+            0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x28, 0x65, 0x29, 0x7b, 0x72,
+            0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72,
+            0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x65, 0x29, 0x2e, 0x73, 0x73, 0x65, 0x45, 0x76,
+            0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x21, 0x3d, 0x6e, 0x75, 0x6c, 0x6c, 0x7d,
+            0x7d, 0x29, 0x28, 0x29, 0x3b
+        };
+
+        private const uint8[] GZIP_DATA = {
+            0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xbd, 0x56, 0x4d, 0x8f, 0xdb, 0x36,
+            0x10, 0xfd, 0x2b, 0x5e, 0x1d, 0x02, 0x31, 0xd1, 0x0a, 0x4e, 0x90, 0x02, 0x85, 0x18, 0x16, 0x48,
+            0x37, 0x7b, 0x28, 0x90, 0x6d, 0x8a, 0x38, 0xe8, 0x65, 0xb1, 0x07, 0xae, 0x34, 0x96, 0x09, 0xd0,
+            0x23, 0x97, 0x1c, 0xed, 0x07, 0xbc, 0xfc, 0xef, 0x1d, 0xea, 0xc3, 0xd6, 0x7a, 0xed, 0x36, 0x45,
+            0x8b, 0xde, 0x24, 0x92, 0x43, 0xce, 0xbc, 0x79, 0xf3, 0x66, 0xd2, 0x65, 0x8b, 0x25, 0x99, 0x06,
+            0x53, 0xb1, 0xbd, 0xd3, 0x6e, 0x56, 0xcb, 0x15, 0xad, 0x1f, 0xf2, 0x0a, 0x96, 0x06, 0xe1, 0xf2,
+            0x81, 0x00, 0x7d, 0xdc, 0x4c, 0xbc, 0x87, 0x24, 0xdb, 0x1a, 0x34, 0x54, 0xec, 0x2c, 0x40, 0x6c,
+            0x6b, 0x05, 0xd2, 0x2c, 0xd3, 0xce, 0xa6, 0x74, 0xa0, 0x09, 0x2e, 0xef, 0x00, 0x69, 0xd1, 0xb4,
+            0xae, 0x04, 0xa5, 0x5a, 0xec, 0x2f, 0xaa, 0xc4, 0xf6, 0xc4, 0x11, 0x0a, 0x21, 0xab, 0x81, 0x16,
+            0x60, 0xa1, 0xa4, 0xc6, 0xf9, 0x62, 0xe2, 0x8f, 0x03, 0x6a, 0x1d, 0x5e, 0x27, 0xd7, 0xfc, 0xf8,
+            0x79, 0xd9, 0x20, 0xf2, 0x91, 0x9b, 0x24, 0x4b, 0xae, 0x2b, 0x4d, 0xfa, 0xfc, 0x70, 0x31, 0xfe,
+            0xfb, 0x7b, 0xbd, 0x79, 0x7e, 0xa2, 0x5f, 0xb9, 0x09, 0x59, 0x83, 0xdd, 0xb3, 0x13, 0xef, 0x33,
+            0xea, 0x43, 0x76, 0x8a, 0x72, 0xd2, 0x8e, 0xbd, 0x78, 0x7a, 0x22, 0x8e, 0x9c, 0xb4, 0xb1, 0x39,
+            0x58, 0x92, 0xfe, 0xde, 0x50, 0xb9, 0x8a, 0x61, 0x96, 0x9a, 0xc3, 0x8f, 0x11, 0x14, 0xb7, 0xb0,
+            0x6c, 0x1c, 0x5c, 0x58, 0xd0, 0xd8, 0x6e, 0x2e, 0x2d, 0xac, 0xf9, 0xce, 0xa4, 0x88, 0xd7, 0xa0,
+            0xaa, 0x73, 0xbe, 0xe3, 0x17, 0x24, 0x70, 0xa8, 0xed, 0x27, 0xf6, 0x20, 0x75, 0x42, 0xc6, 0x2d,
+            0xaf, 0x30, 0x67, 0x67, 0x26, 0x71, 0x47, 0xd0, 0x3c, 0xc3, 0x97, 0x93, 0x33, 0x75, 0x0d, 0xae,
+            0xdb, 0x4a, 0x5d, 0xd6, 0x3f, 0xc2, 0x67, 0x2f, 0x6c, 0xd3, 0x21, 0xee, 0xbb, 0xe3, 0x85, 0xcf,
+            0xe8, 0x71, 0x03, 0x45, 0x82, 0x4d, 0x05, 0x5f, 0x61, 0x63, 0x75, 0x09, 0x55, 0x12, 0x84, 0x3c,
+            0xbc, 0x37, 0x2f, 0xa3, 0x5d, 0x2a, 0x42, 0x8f, 0x9d, 0xdc, 0x3b, 0xae, 0x97, 0xec, 0xd7, 0x6f,
+            0xae, 0x29, 0xc1, 0xfb, 0x5f, 0xf9, 0x96, 0xa4, 0x30, 0xec, 0x5e, 0x08, 0x7c, 0xc9, 0x08, 0xc9,
+            0x8c, 0x62, 0xac, 0xbd, 0xe5, 0x0c, 0xe1, 0x7e, 0x36, 0xb9, 0x98, 0xe1, 0xda, 0x32, 0x1c, 0xab,
+            0x0b, 0x07, 0x15, 0x2f, 0x1a, 0x6d, 0x7d, 0x41, 0xae, 0x85, 0x20, 0xc2, 0xce, 0x5c, 0xa7, 0x28,
+            0xb6, 0x1c, 0x58, 0x87, 0xc3, 0x47, 0xe2, 0xd0, 0x6e, 0x5b, 0x82, 0xdf, 0xb5, 0x6d, 0x21, 0xc5,
+            0x2c, 0x19, 0xd3, 0x91, 0x88, 0x1e, 0x77, 0xdf, 0x03, 0xd6, 0x45, 0xea, 0xe9, 0x4a, 0x47, 0xac,
+            0x31, 0xbb, 0x13, 0x1d, 0x36, 0x4a, 0x61, 0x6b, 0xed, 0xde, 0x1b, 0xfe, 0x09, 0xd1, 0x08, 0x8e,
+            0xa0, 0xec, 0x7b, 0x94, 0xb5, 0x82, 0x43, 0x94, 0xe3, 0x32, 0xa9, 0xbf, 0xf5, 0x47, 0x8e, 0x34,
+            0xf0, 0x1b, 0x6b, 0x28, 0x65, 0x02, 0x31, 0x28, 0x8d, 0x4b, 0xe3, 0xb2, 0x51, 0x73, 0x69, 0x3e,
+            0xb8, 0xdc, 0x02, 0xd6, 0xb4, 0x92, 0xe6, 0xcd, 0x1b, 0xa6, 0x43, 0x83, 0x9e, 0x66, 0xad, 0x72,
+            0xd7, 0xe6, 0x26, 0x66, 0x70, 0x9d, 0x0a, 0xd9, 0xaf, 0x95, 0x6a, 0x5a, 0x1d, 0x1c, 0x88, 0x65,
+            0xef, 0xc6, 0x28, 0x02, 0xff, 0x9f, 0xd5, 0xf9, 0x6d, 0x53, 0x3d, 0x5e, 0x34, 0xc8, 0x34, 0x43,
+            0xcf, 0x88, 0x89, 0xad, 0xce, 0x1d, 0xac, 0x9b, 0xbb, 0xde, 0xf3, 0xcf, 0xc6, 0x73, 0xd1, 0x81,
+            0x4b, 0xdb, 0xac, 0x14, 0xf2, 0x99, 0xe1, 0x33, 0xae, 0xe0, 0x9e, 0x2b, 0x3f, 0x77, 0x9c, 0xbc,
+            0xe2, 0xc4, 0xea, 0x9a, 0x39, 0x03, 0xfb, 0x07, 0x97, 0x7c, 0x0c, 0xf2, 0x58, 0x0c, 0x42, 0x9e,
+            0xb6, 0x9f, 0x58, 0x06, 0xf9, 0x12, 0x5e, 0x14, 0x3b, 0x58, 0x47, 0xe7, 0x54, 0x29, 0x75, 0xae,
+            0xab, 0xea, 0xa5, 0xc7, 0x21, 0x9c, 0x26, 0xc0, 0xea, 0xe1, 0x7c, 0x70, 0xe1, 0x7f, 0xa6, 0x40,
+            0xd3, 0x5b, 0x7c, 0xeb, 0x1f, 0x5f, 0x6c, 0xa0, 0x8c, 0xc0, 0xcb, 0x26, 0x67, 0xdc, 0x2e, 0x35,
+            0xbf, 0xb9, 0x4b, 0x1a, 0x75, 0x49, 0xa3, 0x11, 0xaa, 0xdc, 0x5b, 0xc3, 0xdc, 0x9f, 0x67, 0xef,
+            0xc5, 0x99, 0x52, 0x91, 0x31, 0x45, 0xb2, 0x03, 0xb7, 0x27, 0xcd, 0x7f, 0x96, 0xef, 0xc3, 0x47,
+            0xdf, 0x8b, 0x8c, 0xeb, 0xb3, 0x93, 0xcd, 0x61, 0x83, 0xa1, 0xd9, 0x1d, 0xe2, 0x5c, 0xc9, 0x83,
+            0xbd, 0x7f, 0x93, 0x4f, 0x77, 0x2c, 0x9f, 0xc7, 0x3d, 0xe2, 0x14, 0xef, 0x2a, 0xde, 0xf4, 0x2a,
+            0xca, 0x71, 0xc2, 0xb1, 0x6c, 0x9d, 0xa0, 0x02, 0xf4, 0xb5, 0x37, 0x88, 0xf7, 0xc8, 0x05, 0xa7,
+            0xbe, 0xe7, 0x6c, 0x64, 0x86, 0x7b, 0xfe, 0x56, 0x88, 0x5a, 0xee, 0xd8, 0x8f, 0xa0, 0x39, 0x09,
+            0x7b, 0xe7, 0x90, 0xf5, 0x14, 0x32, 0x1c, 0x99, 0x76, 0xbc, 0x01, 0xb1, 0x85, 0xf4, 0x79, 0xc3,
+            0xe1, 0xba, 0xe6, 0x79, 0x32, 0xf7, 0xf5, 0x12, 0xb7, 0x5e, 0x08, 0x74, 0xb7, 0xca, 0x02, 0xdd,
+            0x19, 0x16, 0x90, 0x8d, 0x42, 0x1d, 0x3a, 0x17, 0x2d, 0x6b, 0xeb, 0x94, 0x06, 0x9e, 0x53, 0xae,
+            0xab, 0xc7, 0x05, 0xf1, 0xeb, 0x4a, 0xa9, 0xa9, 0x62, 0x5f, 0x7c, 0xfe, 0xb2, 0xb8, 0xfc, 0x24,
+            0xb6, 0xa8, 0xf0, 0xe9, 0x69, 0x2e, 0x51, 0x71, 0x19, 0xac, 0xf2, 0xb5, 0x7e, 0x48, 0xfb, 0x0f,
+            0x83, 0x29, 0xbe, 0x7e, 0x97, 0xbd, 0x7d, 0xf7, 0xa3, 0xc8, 0xde, 0x8a, 0x41, 0xd2, 0xf0, 0xf5,
+            0x0f, 0xf3, 0xb9, 0xbc, 0x37, 0x58, 0x35, 0xf7, 0xb9, 0x67, 0x6a, 0x9b, 0x35, 0x34, 0x2d, 0xa5,
+            0x93, 0xee, 0xc9, 0xf2, 0xce, 0xc1, 0x87, 0x88, 0x4b, 0xe8, 0x42, 0x6c, 0x36, 0x80, 0x27, 0x22,
+            0x3c, 0x0c, 0xee, 0x0b, 0x1f, 0x9d, 0x34, 0x9f, 0x3e, 0x26, 0x7c, 0xf5, 0x0a, 0x7f, 0x9a, 0x8f,
+            0xea, 0x47, 0xca, 0xe5, 0x7f, 0xb4, 0xe0, 0x1e, 0xc7, 0xd6, 0xfd, 0xd1, 0xda, 0x74, 0xd2, 0x85,
+            0xb3, 0xd9, 0x41, 0x13, 0xe6, 0x85, 0xbd, 0x00, 0xec, 0xb6, 0x27, 0x4b, 0x83, 0xe8, 0x5a, 0x20,
+            0x2e, 0xf1, 0xb9, 0x84, 0x0f, 0x34, 0x8a, 0x2e, 0x44, 0xd1, 0xd5, 0x29, 0x5d, 0xc3, 0x8d, 0x08,
+            0xa8, 0xe6, 0xe1, 0x18, 0xad, 0x9d, 0x38, 0x28, 0x7d, 0xe5, 0xff, 0x42, 0xff, 0xdd, 0xc0, 0xab,
+            0xae, 0xcd, 0x76, 0xe1, 0x31, 0x8f, 0xfd, 0x91, 0x1a, 0xc8, 0x26, 0x90, 0xfe, 0xe3, 0x76, 0xbd,
+            0x1e, 0x2a, 0x31, 0x44, 0x92, 0x8d, 0xad, 0x79, 0x5a, 0x40, 0x76, 0x90, 0x8d, 0x43, 0x99, 0x80,
+            0xa1, 0x28, 0xe8, 0x88, 0xd6, 0x81, 0x38, 0x32, 0x4c, 0xd0, 0xd9, 0x74, 0xd8, 0x3a, 0x70, 0x14,
+            0x4e, 0x3a, 0x4a, 0x93, 0xb9, 0xe2, 0xca, 0x78, 0x6f, 0xb0, 0x8e, 0xce, 0xd2, 0xe8, 0xec, 0xd0,
+            0x80, 0x66, 0x5d, 0xab, 0x1f, 0x86, 0x8a, 0xd9, 0x92, 0x9b, 0x3f, 0xec, 0x63, 0xe0, 0xc7, 0x59,
+            0x17, 0xf8, 0xcd, 0x38, 0x1f, 0xec, 0x46, 0x46, 0x3f, 0x85, 0x2e, 0x8e, 0x15, 0x2c, 0xcd, 0xe4,
+            0x34, 0x7a, 0xce, 0xf1, 0xfa, 0x2b, 0xf8, 0x0d, 0x1f, 0x89, 0x69, 0x88, 0x95, 0x1c, 0x39, 0xda,
+            0x33, 0x7b, 0xd0, 0xf6, 0x05, 0x13, 0x26, 0xca, 0xb4, 0x59, 0x9a, 0x52, 0x0f, 0xc2, 0x2c, 0x27,
+            0x43, 0xd6, 0xb7, 0x6e, 0x5c, 0x8b, 0x8b, 0x75, 0x1e, 0xc9, 0xc5, 0xea, 0x17, 0x6b, 0x3d, 0x52,
+            0x93, 0xe0, 0x81, 0x86, 0xb9, 0xac, 0xa0, 0xe9, 0x74, 0x72, 0x37, 0x19, 0x6e, 0xbe, 0x03, 0xd4,
+            0xb3, 0x4e, 0x63, 0x78, 0x3c, 0x4a, 0x85, 0xfc, 0x13, 0xe5, 0xa4, 0x7f, 0xad, 0x25, 0x0b, 0x00,
+            0x00
+        };
+
+        private const uint8[] ZSTD_DATA = {
+            0x28, 0xb5, 0x2f, 0xfd, 0x60, 0x25, 0x0a, 0x05, 0x21, 0x00, 0x36, 0x35, 0x95, 0x25, 0x00, 0x91,
+            0x56, 0x07, 0xd5, 0x8f, 0xd1, 0x24, 0x42, 0xb4, 0x62, 0x61, 0xe3, 0x7f, 0xde, 0x12, 0x22, 0x1d,
+            0xb6, 0xf3, 0xca, 0x06, 0xf4, 0x98, 0x53, 0xce, 0xa7, 0x0a, 0x8f, 0x95, 0xf0, 0x2c, 0x54, 0x55,
+            0x55, 0xd5, 0xac, 0x88, 0x00, 0x89, 0x00, 0x88, 0x00, 0x53, 0x5c, 0x7e, 0xef, 0x43, 0x5f, 0x72,
+            0x12, 0x5c, 0xa7, 0xe9, 0xbd, 0xe5, 0x93, 0xe4, 0x42, 0x6d, 0xfc, 0x14, 0x39, 0xcf, 0xe8, 0x19,
+            0x4e, 0x73, 0x1a, 0x9f, 0xca, 0xd3, 0x32, 0x43, 0x5f, 0x4f, 0x77, 0x93, 0x8c, 0x7d, 0xc8, 0x75,
+            0x47, 0x47, 0x5f, 0xe2, 0xd8, 0xae, 0x21, 0x77, 0xdb, 0xd9, 0x2a, 0xc6, 0x25, 0x66, 0x28, 0x41,
+            0xec, 0x08, 0x51, 0x9a, 0xd6, 0x60, 0xf4, 0xf3, 0xdd, 0xf9, 0x10, 0x9c, 0x52, 0x4a, 0x43, 0x59,
+            0xa6, 0xfa, 0xec, 0x50, 0x9e, 0xfd, 0x7c, 0xfa, 0xa4, 0x2f, 0xb5, 0x5a, 0xbb, 0x62, 0xd0, 0x52,
+            0x10, 0xfe, 0x61, 0x6a, 0x4e, 0x7a, 0x8f, 0x91, 0xbc, 0xe3, 0xf9, 0x59, 0x91, 0x7c, 0x87, 0x52,
+            0xc5, 0xee, 0xb4, 0x5c, 0x59, 0xb5, 0xe6, 0x94, 0x36, 0x74, 0xdf, 0x1b, 0x92, 0xaf, 0x8c, 0x0e,
+            0xb9, 0x0d, 0x4b, 0x57, 0x9e, 0xf4, 0xe0, 0x88, 0xa9, 0xd8, 0xda, 0x29, 0xfb, 0x59, 0x2a, 0x5a,
+            0x01, 0x6c, 0x60, 0x40, 0xbe, 0x4a, 0x4b, 0xfb, 0xc9, 0xb1, 0x82, 0x7c, 0x10, 0x28, 0x17, 0xcf,
+            0xa8, 0x35, 0xab, 0xe5, 0x74, 0xa1, 0x0f, 0xf6, 0x61, 0xa4, 0xaf, 0xd3, 0x44, 0x2d, 0x84, 0x0c,
+            0xd3, 0x36, 0x46, 0x34, 0xa5, 0xac, 0x69, 0xda, 0xae, 0x53, 0x53, 0xbc, 0x78, 0x53, 0x19, 0x92,
+            0xbb, 0x19, 0x56, 0x24, 0x2b, 0xb6, 0x2b, 0x56, 0x56, 0x4f, 0x71, 0x3b, 0x74, 0x8a, 0xb2, 0xf7,
+            0xd0, 0x39, 0x52, 0x69, 0x99, 0xa9, 0xda, 0xd7, 0x23, 0xf3, 0x7d, 0x7c, 0xf5, 0xe3, 0xb1, 0x5a,
+            0x2b, 0xe3, 0x25, 0x9d, 0xe6, 0xd0, 0x94, 0xa0, 0xf4, 0xcf, 0x64, 0x0a, 0x7e, 0x47, 0xf1, 0x55,
+            0xb6, 0x1e, 0xf7, 0x58, 0x6d, 0xa0, 0x3f, 0x71, 0xba, 0xbc, 0xe2, 0xd0, 0xdc, 0xc6, 0xf9, 0x85,
+            0xa3, 0x1b, 0x75, 0xe8, 0x9c, 0x22, 0xa7, 0xb4, 0xf1, 0xe2, 0x4b, 0x92, 0xe4, 0x76, 0x52, 0xc5,
+            0x28, 0xa5, 0x6e, 0x21, 0x7d, 0x8c, 0x57, 0xec, 0xe8, 0x10, 0xef, 0xd8, 0x13, 0x0e, 0x28, 0x9e,
+            0x1d, 0xe5, 0x35, 0xd5, 0x76, 0x67, 0x32, 0x7f, 0xa7, 0xa3, 0x8f, 0x7d, 0x6d, 0x7b, 0xe3, 0xb5,
+            0x5f, 0xb1, 0xb2, 0x6e, 0x5c, 0x19, 0x72, 0xd3, 0xfe, 0xf6, 0x25, 0x2b, 0xe3, 0xc7, 0xde, 0xda,
+            0xae, 0xca, 0xb8, 0xb1, 0x83, 0xc6, 0x81, 0x10, 0x80, 0x1d, 0x34, 0xc8, 0xfa, 0x23, 0x27, 0xea,
+            0xba, 0x2b, 0x4f, 0x94, 0xf0, 0x8c, 0xdc, 0x7c, 0xcf, 0x2f, 0x13, 0x8b, 0x49, 0xb0, 0x51, 0xa9,
+            0x15, 0x82, 0xa2, 0x8b, 0xef, 0x81, 0x94, 0x3a, 0xb6, 0xaf, 0x3e, 0xe6, 0xde, 0x76, 0x45, 0x6f,
+            0xcd, 0xa5, 0x48, 0xe9, 0x23, 0x1a, 0xf6, 0xb1, 0xa7, 0x51, 0x8b, 0xbf, 0x6f, 0x2a, 0x21, 0x30,
+            0xd3, 0x72, 0x76, 0xb1, 0x62, 0x6c, 0x17, 0x5d, 0x19, 0x7b, 0x67, 0x84, 0x03, 0x9a, 0x19, 0x4e,
+            0x02, 0xa8, 0x8c, 0xae, 0x09, 0x3e, 0x8f, 0x2d, 0x0b, 0x86, 0xa4, 0x30, 0xa4, 0x1e, 0x4d, 0x77,
+            0x3e, 0x55, 0x8f, 0x2d, 0x56, 0x2b, 0x00, 0xa6, 0x9d, 0xde, 0x78, 0xb7, 0x5d, 0x4e, 0xb2, 0xd8,
+            0xf8, 0xc8, 0x48, 0x4e, 0x1e, 0xa3, 0x3b, 0x2f, 0xf4, 0x15, 0x16, 0x9e, 0x11, 0xdd, 0xc8, 0xed,
+            0x0e, 0x99, 0x72, 0xeb, 0x15, 0x9d, 0x4e, 0x31, 0xaa, 0xaf, 0xa5, 0x95, 0x94, 0xca, 0x88, 0x3e,
+            0xc0, 0x3f, 0x55, 0x4b, 0xa3, 0x15, 0x6b, 0xa6, 0x90, 0x2b, 0x04, 0x6e, 0x65, 0x18, 0xa7, 0xf4,
+            0x8a, 0x6f, 0x85, 0xff, 0xd1, 0x9f, 0x1e, 0x6d, 0x4d, 0x13, 0x03, 0x07, 0x9f, 0xd2, 0x70, 0x0c,
+            0x1b, 0xb2, 0xb0, 0x01, 0x01, 0xbb, 0xbf, 0x4c, 0xec, 0x2f, 0xb3, 0x56, 0xb6, 0x8d, 0x97, 0x6c,
+            0x6a, 0xde, 0x22, 0x2d, 0xfa, 0xd4, 0x65, 0x26, 0xb4, 0x32, 0xf3, 0x20, 0x10, 0x04, 0x81, 0x65,
+            0x05, 0x8d, 0x25, 0x18, 0x14, 0x34, 0x03, 0x81, 0x5d, 0x2b, 0xd7, 0x46, 0xb4, 0xb8, 0x4a, 0xc7,
+            0x08, 0xb8, 0x0f, 0xd2, 0xd1, 0xb1, 0x70, 0x2b, 0xe6, 0x20, 0x99, 0x4c, 0x40, 0x44, 0x1c, 0x84,
+            0x30, 0x80, 0xbc, 0xa8, 0x21, 0x39, 0x53, 0x0c, 0x8d, 0x88, 0x48, 0x50, 0x90, 0x24, 0x69, 0x0e,
+            0x40, 0x44, 0x20, 0x08, 0x4d, 0x99, 0x79, 0x62, 0xd0, 0x38, 0x90, 0xb1, 0x18, 0xe3, 0x84, 0x30,
+            0x62, 0x44, 0x48, 0x02, 0x11, 0x49, 0xca, 0x29, 0xac, 0x51, 0x68, 0x0c, 0x67, 0x60, 0x08, 0xcb,
+            0x1b, 0x70, 0x24, 0x57, 0x42, 0x91, 0x80, 0x6d, 0x26, 0xee, 0x09, 0xdd, 0x7b, 0x30, 0xc0, 0xe0,
+            0x71, 0x22, 0xd9, 0xe4, 0x3b, 0x31, 0x1c, 0xe3, 0x8c, 0xa8, 0x1a, 0xbe, 0x34, 0x0e, 0x7f, 0xb7,
+            0x3b, 0x65, 0xd3, 0x3c, 0x6a, 0x14, 0x8f, 0x68, 0xcf, 0x3e, 0x15, 0xb5, 0x51, 0xba, 0x11, 0xe4,
+            0xef, 0x66, 0xf9, 0x23, 0x34, 0x10, 0xc2, 0x7d, 0x9c, 0xd2, 0x9f, 0x04, 0x1b, 0x4c, 0xd4, 0xb6,
+            0x90, 0x07, 0x17, 0xb0, 0xe0, 0x84, 0x4b, 0x7c, 0x70, 0xd2, 0xef, 0x6c, 0xa0, 0x40, 0x60, 0x30,
+            0xad, 0x02, 0xb7, 0xe8, 0x37, 0x51, 0x27, 0xcf, 0x05, 0x68, 0xd2, 0x6b, 0x9c, 0x10, 0xca, 0x2e,
+            0x6a, 0xf5, 0xf6, 0x07, 0xbf, 0xb2, 0xf8, 0x64, 0x16, 0x01, 0xe3, 0x0f, 0x08, 0xd6, 0xe5, 0x20,
+            0x2c, 0x43, 0x9b, 0x7a, 0x8c, 0xdc, 0xee, 0xd9, 0x78, 0x49, 0x58, 0x1a, 0xe2, 0x6b, 0x02, 0x6a,
+            0xb4, 0x50, 0xc4, 0x95, 0x4a, 0x5c, 0x3c, 0xfa, 0x2e, 0xc6, 0x80, 0xf4, 0xb9, 0x22, 0xf7, 0x45,
+            0x06, 0x8c, 0x58, 0x97, 0x41, 0xcd, 0xb0, 0xdb, 0xb8, 0x7b, 0x1f, 0x3d, 0x41, 0x6a, 0x0d, 0x91,
+            0x9c, 0x04, 0x45, 0x08, 0xb5, 0x15, 0x78, 0x6e, 0x82, 0x8f, 0x35, 0x69, 0xb8, 0x9b, 0x87, 0x9c,
+            0x61, 0xd2, 0xe4, 0x79, 0xda, 0x4c, 0x29, 0x00, 0x9a, 0x99, 0x09, 0x6d, 0x62, 0x6d, 0xb0, 0x5d,
+            0x92, 0xe6, 0x73, 0x5d, 0xfc, 0x77, 0x08, 0x19, 0x9f, 0xd1, 0x83, 0x87, 0x81, 0x9b, 0x58, 0x07,
+            0x7e, 0x8f, 0x7d, 0x6f, 0xe3, 0xd7, 0xfa, 0xb6, 0x5c, 0x01, 0x13, 0x88, 0x9a, 0xae, 0xc3, 0xc7,
+            0x20, 0xfa, 0xce, 0x8b, 0x9d, 0x5e, 0x0a, 0x27, 0x01, 0x9b, 0x5f, 0xe1, 0xb8, 0x02, 0x18, 0x4b,
+            0x3d, 0xe9, 0xe2, 0x17, 0x97, 0x26, 0x23, 0x54, 0x31, 0xdf, 0x36, 0x40, 0x99, 0x21, 0x33, 0x03,
+            0x68, 0x60, 0x98, 0x86, 0x04, 0x50, 0xb1, 0x6b, 0x53, 0x06, 0x34, 0xc9, 0xc5, 0x26, 0xfb, 0x53,
+            0x79, 0x60, 0x0b, 0x62, 0x04, 0x88, 0x6e, 0x79, 0xc9, 0x34, 0x58, 0x78, 0xa1, 0x65, 0x71, 0x43,
+            0xde, 0x13, 0x30, 0xca, 0x4f, 0x8e, 0x1e, 0x2e, 0x85, 0xd4, 0xd7, 0xc5, 0x88, 0xe2, 0xb2, 0x34,
+            0xb2, 0x31, 0xb1, 0x0a, 0x30, 0xa1, 0xc9, 0x46, 0xc7, 0x1d, 0x92, 0xfb, 0xd2, 0xd6, 0xf1, 0x1f,
+            0x86, 0x4a, 0x04, 0x83, 0x8f, 0xd5, 0x37, 0xab, 0x76, 0x58, 0x1a, 0xda, 0x7b, 0x77, 0x4d, 0xb2,
+            0x9c, 0x16, 0x8e, 0x99, 0x05, 0xe2, 0xe7, 0xda, 0xcf, 0xe3, 0xf2, 0x16, 0x33, 0xe7, 0x39, 0xfc,
+            0xa9, 0x72, 0x9b, 0xda, 0x36, 0xc2, 0xa5, 0x80, 0xea, 0xbc, 0x80, 0x76, 0x84, 0xdb, 0x38, 0x4e,
+            0xbc, 0xcf, 0xa0, 0x1e, 0xa6, 0x15, 0x3e, 0x15, 0xf1, 0xb3, 0x1a, 0x52, 0x3b, 0x7e, 0x10, 0x28,
+            0xf4, 0x36, 0x95, 0xc4, 0x72, 0x9b, 0xe1, 0x82, 0x98, 0xa8, 0x27, 0xda, 0xa2, 0x79, 0x8a, 0x19,
+            0x82, 0x7f, 0x2d, 0xf9, 0xfa, 0xcf, 0x81, 0x2e, 0xae, 0x02
+        };
+
+        private const uint8[] BR_DATA = {
+            0x1b, 0x24, 0x0b, 0x00, 0x8c, 0xc2, 0x71, 0xef, 0xd3, 0x1e, 0xad, 0x6d, 0x11, 0x4b, 0xd9, 0xe4,
+            0xfb, 0xe9, 0x74, 0x5a, 0x63, 0x97, 0xf4, 0xfb, 0x7e, 0xae, 0xc0, 0xa7, 0xa8, 0x38, 0x8c, 0x1d,
+            0x03, 0x00, 0xe7, 0xa2, 0x2d, 0x6b, 0x4e, 0x54, 0x76, 0xc4, 0xd5, 0x65, 0x30, 0x1b, 0x27, 0x42,
+            0xb9, 0xfe, 0x1e, 0xb2, 0x0b, 0xdc, 0x5f, 0x67, 0xea, 0xf7, 0x2d, 0x9d, 0xbd, 0xf6, 0x7c, 0x54,
+            0x7c, 0x94, 0x6b, 0x08, 0x85, 0x53, 0xc9, 0xfc, 0x9d, 0xa1, 0x96, 0x36, 0xb7, 0xf4, 0xee, 0x52,
+            0x14, 0x38, 0x24, 0x0e, 0x87, 0xb5, 0x4d, 0x1b, 0xd0, 0x35, 0xd2, 0xef, 0x18, 0x43, 0x09, 0x18,
+            0xec, 0xb2, 0x1e, 0x27, 0x49, 0xbe, 0x16, 0x87, 0x7e, 0x8b, 0xf5, 0x6f, 0x10, 0xae, 0x24, 0x02,
+            0x73, 0xf3, 0x5b, 0x4a, 0xe3, 0x9c, 0x8f, 0x32, 0x6a, 0xe2, 0xa3, 0x4a, 0x31, 0x5b, 0x18, 0x06,
+            0xcd, 0x89, 0xcc, 0x4c, 0xea, 0x50, 0x95, 0x01, 0xbd, 0xc5, 0x06, 0x9a, 0x77, 0x41, 0x79, 0xb7,
+            0xc5, 0x76, 0x67, 0x8c, 0x0b, 0x25, 0x3e, 0xd9, 0x1e, 0x52, 0x0a, 0xa2, 0xd0, 0xa5, 0xcd, 0xd6,
+            0xac, 0x34, 0xae, 0x03, 0x3a, 0xd1, 0xce, 0xd9, 0x9a, 0xa5, 0xcf, 0x7a, 0x03, 0x5d, 0x97, 0x9b,
+            0x7e, 0xfa, 0xbb, 0x7b, 0xf1, 0x6e, 0xbc, 0xed, 0xdc, 0x9b, 0xa4, 0x43, 0x12, 0x34, 0xd2, 0x62,
+            0x0f, 0xca, 0x1c, 0x40, 0x1a, 0xac, 0x2a, 0x07, 0x25, 0x4c, 0x06, 0xac, 0x0a, 0x45, 0x8f, 0x44,
+            0xa5, 0xf6, 0xd5, 0x68, 0x5e, 0x19, 0x95, 0x8a, 0xaf, 0xb3, 0x35, 0x7d, 0xed, 0xb8, 0xa1, 0x3e,
+            0x8f, 0x4f, 0xd5, 0x47, 0x8b, 0xb0, 0x94, 0xef, 0x84, 0x51, 0x8c, 0xe5, 0x2a, 0x55, 0x6c, 0xde,
+            0x28, 0x63, 0xa8, 0x24, 0x3b, 0x01, 0x37, 0x55, 0x28, 0x23, 0x68, 0x13, 0xb3, 0x4e, 0x11, 0x13,
+            0xaa, 0xab, 0xb4, 0xac, 0xd8, 0xa8, 0x1b, 0xe5, 0xb5, 0xc7, 0xa2, 0x89, 0xd6, 0xc7, 0x56, 0x36,
+            0xb9, 0xfd, 0xb6, 0x57, 0x47, 0xb9, 0x43, 0x9f, 0x1b, 0x91, 0xdd, 0x68, 0x3a, 0x9c, 0x78, 0x55,
+            0xe6, 0x61, 0x34, 0xdc, 0x08, 0x14, 0x45, 0xf8, 0xe2, 0x93, 0x98, 0x22, 0xb8, 0x3b, 0xd4, 0x48,
+            0xba, 0x2d, 0x70, 0xa3, 0xd2, 0x4b, 0x57, 0xbd, 0xe9, 0x17, 0xf0, 0xb1, 0x3c, 0xe7, 0x63, 0xfd,
+            0x68, 0xbc, 0x29, 0xe6, 0xfd, 0x55, 0x8a, 0xb6, 0xd6, 0xe3, 0xf0, 0xa7, 0x88, 0x4c, 0xe1, 0x8b,
+            0x9c, 0x48, 0x04, 0xdb, 0x04, 0x0d, 0x0c, 0x0b, 0xd9, 0x54, 0xd2, 0x98, 0x03, 0xfb, 0xca, 0x02,
+            0x8d, 0xdb, 0x9e, 0x43, 0xb8, 0xec, 0x06, 0xc8, 0x3f, 0xf0, 0xa9, 0xb7, 0x41, 0x45, 0x25, 0x39,
+            0xa2, 0x2b, 0xca, 0xfd, 0x81, 0xa7, 0x01, 0xe9, 0xa0, 0x8a, 0x9d, 0x06, 0xda, 0x3b, 0xde, 0x57,
+            0x9e, 0xaa, 0xd4, 0x14, 0x84, 0x40, 0xca, 0x78, 0xb5, 0x14, 0xc6, 0x95, 0x69, 0x5d, 0xb3, 0xa1,
+            0x1f, 0x6e, 0x81, 0xca, 0xa5, 0x39, 0xff, 0xfe, 0xda, 0x6d, 0xe2, 0x7a, 0x72, 0x24, 0x9d, 0x72,
+            0xe8, 0xec, 0xca, 0x69, 0x36, 0x06, 0x3c, 0x86, 0x97, 0x14, 0x24, 0x29, 0x77, 0xde, 0xab, 0x8f,
+            0x50, 0x14, 0x25, 0x96, 0x79, 0x53, 0x04, 0xca, 0x59, 0x49, 0x43, 0xee, 0x4d, 0x13, 0x68, 0xef,
+            0x8e, 0x0f, 0x72, 0xf3, 0x84, 0x3e, 0x38, 0x6c, 0x2f, 0x71, 0x34, 0x4c, 0xcb, 0x1d, 0x9e, 0xbb,
+            0x42, 0x24, 0x3a, 0x3e, 0x11, 0x12, 0xbd, 0x7d, 0xb8, 0x23, 0xf4, 0x39, 0xf4, 0xa3, 0x6f, 0x71,
+            0x85, 0xb8, 0x85, 0x80, 0x56, 0x32, 0x98, 0xdf, 0x4e, 0x9d, 0xc4, 0x83, 0x5c, 0xdf, 0xd1, 0xdd,
+            0x08, 0xba, 0x66, 0xbf, 0xf5, 0x6c, 0xfc, 0xa7, 0x5d, 0xb0, 0xb9, 0xe5, 0x34, 0xee, 0xb3, 0x3d,
+            0x81, 0x3f, 0x4f, 0x77, 0xb8, 0xb6, 0x87, 0x68, 0xe9, 0x95, 0x28, 0xce, 0x77, 0xb5, 0xe1, 0x42,
+            0x20, 0x4f, 0xd6, 0x74, 0x7e, 0x90, 0x0d, 0xcb, 0x67, 0x2d, 0xb1, 0x01, 0x0c, 0xc3, 0xf9, 0x1b,
+            0x3a, 0xb7, 0x27, 0x9c, 0x9e, 0xf7, 0x53, 0x70, 0x3d, 0xc9, 0x8d, 0x3d, 0x42, 0xde, 0x31, 0x87,
+            0x80, 0x1e, 0x0e, 0x53, 0xa7, 0x81, 0xf6, 0x9d, 0xab, 0x2b, 0xf0, 0x52, 0x3f, 0x98, 0x02, 0xc2,
+            0x76, 0x1a, 0x34, 0xb6, 0x27, 0x73, 0x70, 0xa0, 0x09, 0x5c, 0x36, 0x8e, 0xf6, 0x79, 0x7f, 0x58,
+            0x47, 0x12, 0x7d, 0xdd, 0x37, 0x02, 0x8a, 0x86, 0xf7, 0x05, 0x94, 0xb4, 0x9c, 0x22, 0x82, 0xb4,
+            0xb6, 0x3d, 0x38, 0xa1, 0x29, 0x01, 0xb4, 0x62, 0x5d, 0x11, 0x56, 0xa8, 0x2a, 0x33, 0x74, 0xb3,
+            0x9d, 0xa4, 0x71, 0x4b, 0x66, 0x84, 0x07, 0x77, 0x47, 0x90, 0xac, 0x3b, 0x1c, 0x6a, 0x0a, 0x89,
+            0x3a, 0x52, 0x3d, 0x3e, 0x79, 0x66, 0xc3, 0x58, 0xdb, 0x44, 0x0f, 0xfa, 0xbb, 0x28, 0x69, 0xac,
+            0xaa, 0xae, 0xb4, 0xbf, 0x67, 0x1f, 0xfc, 0xf5, 0x7f, 0xe5, 0xc2, 0x47, 0xf3, 0x8d, 0xf0, 0xfc,
+            0x9a, 0xef, 0xeb, 0x47, 0x9c, 0xa9, 0x02, 0xad, 0xa5, 0xaf, 0x1d, 0xba, 0xbb, 0xbc, 0x54, 0x6f,
+            0xbf, 0xbb, 0x27, 0x5f, 0x57, 0xa6, 0x88, 0x84, 0x63, 0x53, 0xe1, 0x62, 0x92, 0xeb, 0xdf, 0x7d,
+            0xba, 0x8b, 0x80, 0xf4, 0x2d, 0xe1, 0xcc, 0xd4, 0x22, 0xd7, 0x32, 0x9e, 0x9e, 0xf2, 0xf9, 0x92,
+            0x01, 0x1d, 0xa3, 0x87, 0x25, 0xe2, 0xbe, 0xb3, 0xdf, 0xd6, 0x12, 0x4f, 0xdc, 0xc2, 0xd7, 0xb4,
+            0xe4, 0x4a, 0x45, 0x02, 0x25, 0x77, 0xd1, 0x57, 0x33, 0xf1, 0xc6, 0xd6, 0xb8, 0xa8, 0x21, 0x8a,
+            0x86, 0x3d, 0xfc, 0xea, 0x14, 0x37, 0xd1, 0x86, 0x6f, 0xac, 0xbb, 0x69, 0x07, 0x52, 0xe8, 0xde,
+            0xd5, 0xca, 0x07, 0x04, 0x82, 0xcb, 0x34, 0x96, 0x55, 0xc8, 0x28, 0xab, 0x1c, 0xd4, 0x10, 0xb5,
+            0x83, 0x76, 0xd9, 0x5c, 0xd5, 0x22, 0x6f, 0x5d, 0x53, 0xee, 0x39, 0x54, 0x88, 0x9c, 0x85, 0xb9,
+            0x95, 0x2a, 0x5c, 0xb0, 0x00, 0x76, 0x61, 0x93, 0x02, 0x9b, 0x23, 0x59, 0x85, 0xcb, 0x9e, 0xd9,
+            0xa2, 0xe1, 0xa8, 0xeb, 0x16, 0xdc, 0xea, 0x26, 0x4d, 0xab, 0x9d, 0xe1, 0x63, 0xfa, 0x23, 0xd5,
+            0x9b, 0xdc, 0xbf, 0x4f, 0xa1, 0xe4, 0x18, 0xbf, 0xc4, 0x54, 0xba, 0x54, 0x47, 0x50, 0x51, 0x3a,
+            0xbc, 0x66, 0x1a, 0x5c, 0x8f, 0x0c, 0xbd, 0x55, 0x91, 0x78, 0x16, 0xd6, 0x8b, 0xa5, 0x99, 0xec,
+            0xf4, 0x2a, 0x94, 0xdf, 0x73, 0x3f, 0x7f, 0xe6, 0xae, 0x8f, 0x9f, 0x95, 0xbe, 0x4f, 0x40, 0xd3,
+            0xa6, 0x25, 0xdd, 0x50, 0x1f, 0xc1, 0xc0, 0xb6, 0x08, 0x29, 0x82, 0x4f, 0xad, 0x98, 0xeb, 0x66,
+            0xd7, 0xa2, 0x6b, 0x28, 0x47, 0xff, 0x15, 0x9c, 0xfd, 0x02, 0x5b, 0x91, 0xf1, 0x4c, 0x85, 0xbf,
+            0xd0, 0x02
+        };
+
+    }
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/Static/Sources/htmx-sse.min.js


+ 3 - 1
src/meson.build

@@ -8,12 +8,14 @@ sources = files(
     'ComponentEndpoint.vala',
     'Context.vala',
     'PathProvider.vala',
+    'ContinuationProvider.vala',
     'Static/StaticResource.vala',
     'Static/MemoryStaticResource.vala',
     'Static/FileStaticResource.vala',
     'Static/ConstantStaticResource.vala',
     'Static/StaticResourceProvider.vala',
-    'Static/HtmxResource.vala'
+    'Static/HtmxResource.vala',
+    'Static/HtmxSseResource.vala'
 )
 
 

+ 1 - 1
tools/spry-mkssr/meson.build

@@ -1,4 +1,4 @@
--spry_mkssr_sources = files(
+spry_mkssr_sources = files(
     'spry-mkssr.vala'
 )
 

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů