detached ce78abc

feat(xwm): add map flow, property decoding, serial pairing and reparent handling

MapRequest batches ten GetProperty, GetGeometry and MapWindow; Ready fires once
every reply (and the XRes pid fallback, propClientIDs) is in. Titles, class,
transient-for and fullscreen changes reach the host only when they differ.
WL_SURFACE_SERIAL pairs with set_serial in either order. ReparentNotify drops
or adopts root children. Adds recorded-stream allocation tests.
commit
ce78abc602422d152d0ca8f64f1a568cd8e7c991
author
brice · · 2026-10-22 12:43 UTC
committer
brice · · 2026-10-22 17:54 UTC
parent
50a2e95
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
11 files · +4896 -33
M Makefile +1 -1
@@ -69,7 +69,7 @@ adapter-imports:
6969 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }
7070 # Fast, mandatory guards for tiled content publications and SHM copies.
7171 perf-check:
72- CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations)$$' -count=1
72+ CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations)$$' -count=1
7373 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=1
7474 check: vet test arch fakes-check log-check perf-check
7575
M internal/adapters/wayland/xwm/events.go +14 -6
@@ -34,6 +34,8 @@ func (x *XWM) onEvent(ev *xturbo.Event) {
3434 x.onCreateNotify(ev)
3535 case xproto.KindDestroyNotify:
3636 x.onDestroyNotify(ev)
37+ case xproto.KindReparentNotify:
38+ x.onReparentNotify(ev)
3739 }
3840 if x.host == nil {
3941 if ev.Kind == xproto.KindMapRequest {
@@ -108,12 +110,11 @@ func (x *XWM) onError(e *xturbo.XError) {
108110 if e.Code == xproto.BadAccess {
109111 x.bootErr = ErrWMExists
110112 }
111- case kindProp, kindGeom, kindConfigure, kindFocus:
112- if e.Code != xproto.BadWindow {
113- return
114- }
115- // The window died between request and reply; DestroyNotify follows.
116- _, rec := x.tab.live(e.Args[0])
113+ case kindProp, kindGeom, kindClientIds, kindConfigure, kindFocus:
114+ // Usually BadWindow: the window died between request and reply and
115+ // DestroyNotify follows. Whatever the code, the awaited reply will
116+ // never come, so the map must not wait for it.
117+ s, rec := x.tab.live(e.Args[0])
117118 if rec == nil {
118119 x.stats.Stale++
119120 return
@@ -123,6 +124,13 @@ func (x *XWM) onError(e *xturbo.XError) {
123124 rec.pending &^= 1 << e.Args[1]
124125 case kindGeom:
125126 rec.pending &^= propGeom
127+ case kindClientIds:
128+ rec.pending &^= propClientIDs
129+ default:
130+ return
131+ }
132+ if e.Code != xproto.BadWindow { // a dead window is never announced
133+ x.checkReady(s)
126134 }
127135 }
128136 }
M internal/adapters/wayland/xwm/mapflow.go +368 -13
@@ -1,21 +1,376 @@
11 package xwm
22
3-import "bnema.dev/xturbo"
3+import (
4+ "bnema.dev/xturbo"
5+ "bnema.dev/xturbo/xproto"
6+)
47
5-// beginMap starts the map flow of a managed window: properties, geometry,
6-// MapWindow. Also called by Attach for windows mapped before it.
7-func (x *XWM) beginMap(s Slot) { _ = s }
8+// ICCCM WM_STATE values.
9+const (
10+ wmStateWithdrawn uint32 = 0
11+ wmStateNormal uint32 = 1
12+)
813
9-func (x *XWM) onMapRequest(ev *xturbo.Event) { _ = ev }
10-func (x *XWM) onMapNotify(ev *xturbo.Event) { _ = ev }
11-func (x *XWM) onUnmapNotify(ev *xturbo.Event) { _ = ev }
12-func (x *XWM) onClientMessage(ev *xturbo.Event) { _ = ev }
14+// _NET_WM_STATE client message actions.
15+const (
16+ netStateRemove = 0
17+ netStateAdd = 1
18+ netStateToggle = 2
19+)
1320
14-func (x *XWM) onGeomReply(s Slot, rec *record, r *xturbo.Reply) { _, _, _ = s, rec, r }
15-func (x *XWM) onClientIdsReply(s Slot, rec *record, r *xturbo.Reply) { _, _, _ = s, rec, r }
21+// beginMap starts the map flow of a managed window: every property, the
22+// geometry and MapWindow go out in one batch (wlroots order). Also called by
23+// Attach for windows mapped before it.
24+func (x *XWM) beginMap(s Slot) {
25+ rec := x.tab.rec(s)
26+ if rec.kind != kindManaged || rec.mapping {
27+ return
28+ }
29+ rec.mapping, rec.ready = true, false
30+ rec.hasNetName = false
31+ rec.pending = propGeom
32+ xid := rec.xid
33+ for idx := 0; idx < propCount; idx++ {
34+ x.requestProp(s, idx)
35+ }
36+ b := x.conn.Buf()
37+ x.expect(xproto.GetGeometry(b, xproto.Drawable(xid)), kindGeom, x.tab.tag(s), 0)
38+ xproto.MapWindow(b, xproto.Window(xid))
39+}
1640
17-// SetSerial records the serial of a wl_surface (xwayland_surface_v1.set_serial).
18-func (x *XWM) SetSerial(surfaceID uint64, serial uint64) { _, _ = surfaceID, serial }
41+func (x *XWM) onMapRequest(ev *xturbo.Event) {
42+ if s := x.tab.lookup(uint32(xproto.MapRequestOf(ev).Window())); s != 0 {
43+ x.beginMap(s)
44+ }
45+}
46+
47+func (x *XWM) onMapNotify(ev *xturbo.Event) {
48+ if s := x.tab.lookup(uint32(xproto.MapNotifyOf(ev).Window())); s != 0 {
49+ x.tab.rec(s).mapped = true
50+ }
51+}
52+
53+// onUnmapNotify ends the mapped life of a managed window; a later MapRequest
54+// starts over and re-reads the properties. Synthetic events (ICCCM unmap
55+// requests) are not an unmap.
56+func (x *XWM) onUnmapNotify(ev *xturbo.Event) {
57+ if ev.SendEvent {
58+ return
59+ }
60+ s := x.tab.lookup(uint32(xproto.UnmapNotifyOf(ev).Window()))
61+ if s == 0 {
62+ return
63+ }
64+ rec := x.tab.rec(s)
65+ rec.mapped = false
66+ if rec.kind != kindManaged {
67+ return
68+ }
69+ wasMapping := rec.mapping
70+ rec.ready, rec.mapping, rec.pending = false, false, 0
71+ rec.serial, rec.surface = 0, 0
72+ if wasMapping {
73+ xid := rec.xid
74+ x.setProp32Typed(xid, atomWMState, x.atoms[atomWMState], []uint32{wmStateWithdrawn, 0})
75+ xproto.DeleteProperty(x.conn.Buf(), xproto.Window(xid), xproto.Atom(x.atoms[atomNetWMState]))
76+ x.unlist(xid)
77+ }
78+ if rec.id != 0 {
79+ x.host.Dissociate(s, false)
80+ }
81+}
82+
83+// setProp32Typed is setProp32 with an explicit property type atom.
84+func (x *XWM) setProp32Typed(win uint32, prop int, typ uint32, vals []uint32) {
85+ x.setProp32(win, prop, xproto.Atom(typ), vals)
86+}
87+
88+// checkReady fires Ready once every awaited reply is in.
89+func (x *XWM) checkReady(s Slot) {
90+ rec := x.tab.rec(s)
91+ if rec == nil || rec.pending != 0 || rec.ready || !rec.mapping || rec.kind != kindManaged || x.host == nil {
92+ return
93+ }
94+ rec.ready = true
95+ info := x.info(s)
96+ xid := rec.xid
97+
98+ var state [2]uint32
99+ n := 0
100+ if rec.modal {
101+ state[n] = x.atoms[atomNetWMStateModal]
102+ n++
103+ }
104+ if rec.fullscreen {
105+ state[n] = x.atoms[atomNetWMStateFullscreen]
106+ n++
107+ }
108+ x.setProp32(xid, atomNetWMState, xproto.AtomAtom, state[:n])
109+ x.setProp32Typed(xid, atomWMState, x.atoms[atomWMState], []uint32{wmStateNormal, 0})
110+ x.clients = append(x.clients, xid)
111+ x.stacking = append(x.stacking, xid)
112+ x.publishLists()
113+
114+ x.host.Ready(s, info)
115+ x.tryPair(s)
116+}
117+
118+// info is what the host learns when a window is ready.
119+func (x *XWM) info(s Slot) WindowInfo {
120+ rec := x.tab.rec(s)
121+ parent := x.managedSlot(rec.transient)
122+ fixed := rec.minW > 0 && rec.minH > 0 && rec.minW == rec.maxW && rec.minH == rec.maxH
123+ info := WindowInfo{
124+ PID: int(rec.pid),
125+ Floating: floatingType(rec.wtype) || parent != 0 || fixed,
126+ Parent: parent,
127+ Modal: rec.modal,
128+ Fullscreen: rec.fullscreen,
129+ Title: rec.title,
130+ AppID: rec.class,
131+ }
132+ if info.Floating {
133+ info.Width, info.Height = int(rec.w), int(rec.h)
134+ }
135+ return info
136+}
137+
138+func (x *XWM) onGeomReply(s Slot, rec *record, r *xturbo.Reply) {
139+ if g, ok := xproto.ParseGetGeometryReply(r.Raw); ok {
140+ rec.x, rec.y, rec.w, rec.h = int32(g.X()), int32(g.Y()), uint32(g.Width()), uint32(g.Height())
141+ }
142+ rec.pending &^= propGeom
143+ x.checkReady(s)
144+}
145+
146+// publishLists rewrites _NET_CLIENT_LIST and _NET_CLIENT_LIST_STACKING.
147+func (x *XWM) publishLists() {
148+ x.setProp32(x.root, atomNetClientList, xproto.AtomWindow, x.clients)
149+ x.setProp32(x.root, atomNetClientListStacking, xproto.AtomWindow, x.stacking)
150+}
151+
152+// unlist drops xid from both client lists and republishes them if it was in.
153+func (x *XWM) unlist(xid uint32) {
154+ was := len(x.clients)
155+ x.clients = removeID(x.clients, xid)
156+ x.stacking = removeID(x.stacking, xid)
157+ if len(x.clients) != was {
158+ x.publishLists()
159+ }
160+}
161+
162+func removeID(l []uint32, xid uint32) []uint32 {
163+ for i, v := range l {
164+ if v == xid {
165+ return append(l[:i], l[i+1:]...)
166+ }
167+ }
168+ return l
169+}
170+
171+// onClientMessage handles WL_SURFACE_SERIAL (pairing), the legacy
172+// WL_SURFACE_ID (counted, ignored) and _NET_WM_STATE requests.
173+func (x *XWM) onClientMessage(ev *xturbo.Event) {
174+ e := xproto.ClientMessageOf(ev)
175+ if e.Format() != 32 {
176+ return
177+ }
178+ typ := uint32(e.Type())
179+ switch typ {
180+ case x.atoms[atomWLSurfaceSerial]:
181+ s := x.tab.lookup(uint32(e.Window()))
182+ if s == 0 {
183+ return
184+ }
185+ rec := x.tab.rec(s)
186+ if rec.serial != 0 {
187+ x.log.Debug().Uint32("xid", rec.xid).Msg("duplicate WL_SURFACE_SERIAL ignored")
188+ return
189+ }
190+ d := e.Data().Data32()
191+ rec.serial = uint64(d[1])<<32 | uint64(d[0])
192+ x.tryPair(s)
193+ case x.atoms[atomWLSurfaceID]:
194+ x.stats.LegacyID++
195+ if x.stats.LegacyID == 1 {
196+ x.log.Warn().Msg("WL_SURFACE_ID received: Xwayland did not bind xwayland_shell_v1, window ignored")
197+ }
198+ case x.atoms[atomNetWMState]:
199+ x.onNetWMState(e)
200+ }
201+}
202+
203+// onNetWMState forwards fullscreen requests to the host and records them; the
204+// property itself is written when core answers with a configure.
205+func (x *XWM) onNetWMState(e xproto.ClientMessageEvent) {
206+ s := x.tab.lookup(uint32(e.Window()))
207+ if s == 0 {
208+ return
209+ }
210+ rec := x.tab.rec(s)
211+ if rec.kind != kindManaged {
212+ return
213+ }
214+ d := e.Data().Data32()
215+ apply := func(cur bool) bool {
216+ switch d[0] {
217+ case netStateRemove:
218+ return false
219+ case netStateAdd:
220+ return true
221+ case netStateToggle:
222+ return !cur
223+ }
224+ return cur
225+ }
226+ for _, a := range d[1:3] {
227+ switch {
228+ case a == 0:
229+ case a == x.atoms[atomNetWMStateModal]:
230+ rec.modal = apply(rec.modal)
231+ case a == x.atoms[atomNetWMStateFullscreen]:
232+ on := apply(rec.fullscreen)
233+ if on == rec.fullscreen {
234+ continue
235+ }
236+ rec.fullscreen = on
237+ if rec.ready {
238+ x.host.Fullscreen(s, on)
239+ rec = x.tab.rec(s)
240+ }
241+ }
242+ }
243+}
244+
245+// onReparentNotify keeps the table to root's direct children: a window moved
246+// away is forgotten, one moved into root is treated as newly created.
247+func (x *XWM) onReparentNotify(ev *xturbo.Event) {
248+ e := xproto.ReparentNotifyOf(ev)
249+ xid := uint32(e.Window())
250+ if xid == x.wmWin {
251+ return
252+ }
253+ s := x.tab.lookup(xid)
254+ if uint32(e.Parent()) != x.root {
255+ if s != 0 {
256+ x.dropWindow(s)
257+ }
258+ return
259+ }
260+ if s != 0 {
261+ return
262+ }
263+ s = x.insert(xid)
264+ if s == 0 {
265+ return
266+ }
267+ rec := x.tab.rec(s)
268+ rec.override = e.OverrideRedirect()
269+ rec.x, rec.y = int32(e.X()), int32(e.Y())
270+ if rec.override {
271+ rec.kind = kindUnmanaged
272+ x.stats.UnmanagedSeen++
273+ return
274+ }
275+ if x.host != nil {
276+ x.adopt(s)
277+ }
278+}
279+
280+// dropWindow forgets s: the host is told if it knew the window.
281+func (x *XWM) dropWindow(s Slot) {
282+ rec := x.tab.rec(s)
283+ xid := rec.xid
284+ if rec.kind == kindManaged {
285+ x.unlist(xid)
286+ if x.active == s {
287+ x.active = 0
288+ }
289+ if rec.id != 0 && x.host != nil {
290+ rec.id = 0
291+ x.host.Dissociate(s, true)
292+ }
293+ }
294+ x.tab.remove(s)
295+}
296+
297+// tryPair links the window to the wl_surface carrying its serial, once both
298+// are known and the window is ready (the host maps on the surface's first
299+// buffer, so it must know the window's info by then). Unmanaged windows keep
300+// the surface but are never associated.
301+func (x *XWM) tryPair(s Slot) {
302+ rec := x.tab.rec(s)
303+ if rec.serial == 0 || rec.surface != 0 {
304+ return
305+ }
306+ if rec.kind == kindManaged && !rec.ready {
307+ return
308+ }
309+ for i := 0; i < x.unpairedN; i++ {
310+ if x.unpaired[i].serial != rec.serial {
311+ continue
312+ }
313+ rec.surface = x.unpaired[i].surface
314+ x.unpairedN--
315+ x.unpaired[i] = x.unpaired[x.unpairedN]
316+ if rec.kind == kindManaged {
317+ x.log.Debug().Uint32("xid", rec.xid).Uint64("surface", rec.surface).Msg("x11 window paired")
318+ x.host.Associate(s, rec.surface)
319+ }
320+ return
321+ }
322+}
323+
324+// SetSerial records the serial of a wl_surface (xwayland_surface_v1.set_serial)
325+// and pairs it with the window announcing the same serial.
326+func (x *XWM) SetSerial(surfaceID uint64, serial uint64) {
327+ if serial == 0 || x.closed {
328+ return
329+ }
330+ for i := 0; i < x.unpairedN; i++ {
331+ if x.unpaired[i].serial == serial {
332+ x.unpaired[i].surface = surfaceID
333+ x.pairSerial(serial)
334+ return
335+ }
336+ }
337+ if x.unpairedN == unpairedCap {
338+ copy(x.unpaired[:], x.unpaired[1:])
339+ x.unpairedN--
340+ if !x.warnedUnpaired {
341+ x.warnedUnpaired = true
342+ x.log.Warn().Msg("too many unpaired surfaces, dropping the oldest")
343+ }
344+ }
345+ x.unpaired[x.unpairedN] = struct{ serial, surface uint64 }{serial, surfaceID}
346+ x.unpairedN++
347+ x.pairSerial(serial)
348+}
349+
350+// pairSerial offers a newly known surface serial to the windows.
351+func (x *XWM) pairSerial(serial uint64) {
352+ for i := range x.tab.recs {
353+ if r := &x.tab.recs[i]; r.kind != kindFree && r.serial == serial && r.surface == 0 {
354+ x.tryPair(Slot(i + 1))
355+ break
356+ }
357+ }
358+ x.wake()
359+}
19360
20361 // SurfaceGone forgets a destroyed wl_surface.
21-func (x *XWM) SurfaceGone(surfaceID uint64) { _ = surfaceID }
362+func (x *XWM) SurfaceGone(surfaceID uint64) {
363+ for i := 0; i < x.unpairedN; i++ {
364+ if x.unpaired[i].surface == surfaceID {
365+ x.unpairedN--
366+ x.unpaired[i] = x.unpaired[x.unpairedN]
367+ break
368+ }
369+ }
370+ for i := range x.tab.recs {
371+ if r := &x.tab.recs[i]; r.kind != kindFree && r.surface == surfaceID {
372+ r.surface = 0
373+ }
374+ }
375+ x.wake()
376+}
A internal/adapters/wayland/xwm/mapflow_test.go +789 -0
@@ -0,0 +1,789 @@
1+package xwm
2+
3+import (
4+ "encoding/binary"
5+ "testing"
6+
7+ "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/xproto"
9+ "github.com/bnema/neferwl/internal/ports"
10+ "github.com/stretchr/testify/mock"
11+ "github.com/stretchr/testify/require"
12+)
13+
14+// harness bundles an attached XWM, its peer and the host mock.
15+type harness struct {
16+ t *testing.T
17+ x *XWM
18+ p *xpeer
19+ h *mockhost
20+
21+ ready map[uint32]WindowInfo // by xid, filled by Ready
22+ next ports.WindowID
23+}
24+
25+func newHarness(t *testing.T, mutate func(p *xpeer)) *harness {
26+ t.Helper()
27+ x, p := bootPeer(t, mutate)
28+ hs := &harness{t: t, x: x, p: p, h: newMockhost(t), ready: map[uint32]WindowInfo{}}
29+ src := newMockfdSource(t)
30+ src.EXPECT().Remove().Maybe()
31+ src.EXPECT().SetWritable(mock.Anything).Return(nil).Maybe()
32+ post, _ := newPost()
33+ x.attach(src, hs.h, post)
34+ return hs
35+}
36+
37+func (hs *harness) expectCreated(win uint32) {
38+ hs.next++
39+ hs.h.EXPECT().Created(mock.Anything, win).Return(hs.next).Once()
40+}
41+
42+func (hs *harness) expectReady(win uint32) {
43+ hs.h.EXPECT().Ready(mock.Anything, mock.Anything).Run(func(_ Slot, info WindowInfo) {
44+ hs.ready[win] = info
45+ }).Once()
46+}
47+
48+func (hs *harness) create(win uint32) Slot {
49+ hs.t.Helper()
50+ hs.expectCreated(win)
51+ hs.p.createNotify(win, false)
52+ readUntil(hs.t, hs.x, func() bool { return hs.x.Slot(win) != 0 })
53+ return hs.x.Slot(win)
54+}
55+
56+// mapAndWait creates and maps win and waits for Ready.
57+func (hs *harness) mapAndWait(win uint32) Slot {
58+ hs.t.Helper()
59+ s := hs.create(win)
60+ hs.expectReady(win)
61+ hs.p.mapRequest(win)
62+ readUntil(hs.t, hs.x, func() bool { _, ok := hs.ready[win]; return ok })
63+ return s
64+}
65+
66+func (hs *harness) str(win uint32, atom string, typ uint32, s string) {
67+ hs.p.setProp(win, hs.p.atom(atom), typ, 8, []byte(s))
68+}
69+
70+func (hs *harness) words(win uint32, atom string, typ uint32, w ...uint32) {
71+ hs.p.setProp(win, hs.p.atom(atom), typ, 32, le32(w...))
72+}
73+
74+func (hs *harness) atoms(win uint32, atom string, names ...string) {
75+ var w []uint32
76+ for _, n := range names {
77+ w = append(w, hs.p.atom(n))
78+ }
79+ hs.words(win, atom, uint32(xproto.AtomAtom), w...)
80+}
81+
82+func (hs *harness) classic(win uint32) {
83+ hs.p.setProp(win, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("inst\x00Class\x00"))
84+ hs.str(win, "_NET_WM_NAME", hs.p.atom("UTF8_STRING"), "net title")
85+ hs.p.setProp(win, uint32(xproto.AtomWmName), uint32(xproto.AtomString), 8, []byte("old title"))
86+ hs.words(win, "_NET_WM_PID", uint32(xproto.AtomCardinal), 4242)
87+ hs.p.set(func(p *xpeer) { p.geoms[win] = xpeerGeom{w: 300, h: 200} })
88+}
89+
90+func (hs *harness) count(match func(r xpeerReq) bool) int {
91+ n := 0
92+ for _, r := range hs.p.requests() {
93+ if match(r) {
94+ n++
95+ }
96+ }
97+ return n
98+}
99+
100+func (hs *harness) waitMap(win uint32) {
101+ hs.t.Helper()
102+ readUntil(hs.t, hs.x, func() bool {
103+ return hs.count(func(r xpeerReq) bool { return r.major == opMapWindow && r.u32(4) == win }) > 0
104+ })
105+}
106+
107+func TestMapFlowBatchesRequestsAndReadyFiresOnce(t *testing.T) {
108+ hs := newHarness(t, nil)
109+ const win = 0x500001
110+ hs.classic(win)
111+ hs.create(win)
112+ base := len(hs.p.requests())
113+
114+ hs.p.holdReplies()
115+ hs.p.mapRequest(win)
116+ hs.expectReady(win)
117+ hs.waitMap(win)
118+
119+ reqs := hs.p.requests()[base:]
120+ want := []uint32{
121+ uint32(xproto.AtomWmClass), uint32(xproto.AtomWmName), hs.p.atom("_NET_WM_NAME"), uint32(xproto.AtomWmHints),
122+ uint32(xproto.AtomWmNormalHints), hs.p.atom("WM_PROTOCOLS"), uint32(xproto.AtomWmTransientFor),
123+ hs.p.atom("_NET_WM_WINDOW_TYPE"), hs.p.atom("_NET_WM_STATE"), hs.p.atom("_NET_WM_PID"),
124+ }
125+ require.GreaterOrEqual(t, len(reqs), len(want)+2)
126+ for i, a := range want {
127+ require.EqualValues(t, opGetProperty, reqs[i].major, i)
128+ require.Equal(t, uint32(win), reqs[i].u32(4))
129+ require.Equal(t, a, reqs[i].u32(8), i)
130+ require.EqualValues(t, 1024, reqs[i].u32(20), "long length: one 4 KiB read")
131+ }
132+ require.EqualValues(t, opGetGeometry, reqs[len(want)].major)
133+ require.EqualValues(t, opMapWindow, reqs[len(want)+1].major, "MapWindow in the same batch")
134+
135+ hs.p.release() // every reply arrives after MapWindow went out
136+ readUntil(t, hs.x, func() bool { _, ok := hs.ready[win]; return ok })
137+ info := hs.ready[win]
138+ require.Equal(t, WindowInfo{PID: 4242, Title: "net title", AppID: "Class"}, info, "_NET_WM_NAME wins, class is the second string")
139+
140+ state, ok := hs.p.prop(win, "WM_STATE")
141+ require.True(t, ok)
142+ require.Equal(t, []uint32{1, 0}, atomsOf(state))
143+ list, ok := hs.p.prop(peerRoot, "_NET_CLIENT_LIST")
144+ require.True(t, ok)
145+ require.Equal(t, []uint32{win}, atomsOf(list))
146+}
147+
148+func TestMapFlowFloatingAndModal(t *testing.T) {
149+ hint := func(minw, minh, maxw, maxh uint32) []byte {
150+ return le32(hintMinSize|hintMaxSize, 0, 0, 0, 0, minw, minh, maxw, maxh, 0, 0, 0, 0, 0, 0, 0, 0, 0)
151+ }
152+ cases := []struct {
153+ name string
154+ setup func(hs *harness, win uint32)
155+ want func(info WindowInfo)
156+ }{
157+ {"dialog type", func(hs *harness, w uint32) {
158+ hs.atoms(w, "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DIALOG")
159+ }, func(i WindowInfo) {
160+ require.True(t, i.Floating)
161+ require.Equal(t, 300, i.Width)
162+ require.Equal(t, 200, i.Height)
163+ }},
164+ {"utility type", func(hs *harness, w uint32) {
165+ hs.atoms(w, "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_UTILITY")
166+ }, func(i WindowInfo) { require.True(t, i.Floating) }},
167+ {"splash type", func(hs *harness, w uint32) {
168+ hs.atoms(w, "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_SPLASH")
169+ }, func(i WindowInfo) { require.True(t, i.Floating) }},
170+ {"normal type", func(hs *harness, w uint32) {
171+ hs.atoms(w, "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_NORMAL")
172+ }, func(i WindowInfo) { require.False(t, i.Floating); require.Zero(t, i.Width) }},
173+ {"fixed size", func(hs *harness, w uint32) {
174+ hs.p.setProp(w, uint32(xproto.AtomWmNormalHints), uint32(xproto.AtomWmSizeHints), 32, hint(200, 100, 200, 100))
175+ }, func(i WindowInfo) { require.True(t, i.Floating) }},
176+ {"resizable", func(hs *harness, w uint32) {
177+ hs.p.setProp(w, uint32(xproto.AtomWmNormalHints), uint32(xproto.AtomWmSizeHints), 32, hint(100, 100, 800, 600))
178+ }, func(i WindowInfo) { require.False(t, i.Floating) }},
179+ {"modal", func(hs *harness, w uint32) {
180+ hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_MODAL")
181+ }, func(i WindowInfo) { require.True(t, i.Modal); require.False(t, i.Fullscreen) }},
182+ {"fullscreen at map", func(hs *harness, w uint32) {
183+ hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN")
184+ }, func(i WindowInfo) { require.True(t, i.Fullscreen) }},
185+ }
186+ for _, c := range cases {
187+ t.Run(c.name, func(t *testing.T) {
188+ hs := newHarness(t, nil)
189+ const win = 0x500001
190+ hs.classic(win)
191+ c.setup(hs, win)
192+ hs.mapAndWait(win)
193+ c.want(hs.ready[win])
194+ })
195+ }
196+}
197+
198+func TestMapFlowTransientForManagedWindowFloats(t *testing.T) {
199+ hs := newHarness(t, nil)
200+ const parent, child = 0x500001, 0x500002
201+ hs.classic(parent)
202+ ps := hs.mapAndWait(parent)
203+ hs.classic(child)
204+ hs.p.setProp(child, uint32(xproto.AtomWmTransientFor), uint32(xproto.AtomWindow), 32, le32(parent))
205+ hs.mapAndWait(child)
206+ require.True(t, hs.ready[child].Floating)
207+ require.Equal(t, ps, hs.ready[child].Parent)
208+}
209+
210+func TestMapFlowTransientForUnknownWindowIsNotAParent(t *testing.T) {
211+ hs := newHarness(t, nil)
212+ const win = 0x500001
213+ hs.classic(win)
214+ hs.p.setProp(win, uint32(xproto.AtomWmTransientFor), uint32(xproto.AtomWindow), 32, le32(0x777777))
215+ hs.mapAndWait(win)
216+ require.Zero(t, hs.ready[win].Parent)
217+ require.False(t, hs.ready[win].Floating)
218+}
219+
220+func TestMapFlowClassFallsBackToInstance(t *testing.T) {
221+ hs := newHarness(t, nil)
222+ const win = 0x500001
223+ hs.classic(win)
224+ hs.p.setProp(win, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("onlyinstance\x00"))
225+ hs.mapAndWait(win)
226+ require.Equal(t, "onlyinstance", hs.ready[win].AppID)
227+}
228+
229+func TestMapFlowTitleFallsBackToWMName(t *testing.T) {
230+ hs := newHarness(t, nil)
231+ const win = 0x500001
232+ hs.classic(win)
233+ hs.p.set(func(p *xpeer) { delete(p.props[win], p.atoms["_NET_WM_NAME"]) })
234+ hs.mapAndWait(win)
235+ require.Equal(t, "old title", hs.ready[win].Title)
236+}
237+
238+func TestMapFlowPIDFromXRes(t *testing.T) {
239+ hs := newHarness(t, func(p *xpeer) { p.pids = map[uint32]uint32{0x500001: 777} })
240+ const win = 0x500001
241+ hs.classic(win)
242+ hs.p.set(func(p *xpeer) { delete(p.props[win], p.atoms["_NET_WM_PID"]) })
243+ hs.create(win)
244+ hs.expectReady(win)
245+ hs.p.mapRequest(win)
246+ readUntil(t, hs.x, func() bool { _, ok := hs.ready[win]; return ok })
247+ require.Equal(t, 777, hs.ready[win].PID, "Ready waited for the QueryClientIds reply")
248+ require.Equal(t, 1, hs.count(func(r xpeerReq) bool { return r.major == 144 && r.minor == 4 }))
249+ require.Zero(t, hs.x.tab.rec(hs.x.Slot(win)).pending)
250+}
251+
252+func TestMapFlowPIDUnknownStillReady(t *testing.T) {
253+ hs := newHarness(t, nil)
254+ const win = 0x500001
255+ hs.classic(win)
256+ hs.p.set(func(p *xpeer) { delete(p.props[win], p.atoms["_NET_WM_PID"]) })
257+ hs.mapAndWait(win)
258+ require.Zero(t, hs.ready[win].PID)
259+}
260+
261+func TestMapFlowNoXResAsksNothing(t *testing.T) {
262+ exts := fullPeerExts()
263+ delete(exts, "X-Resource")
264+ fd, p := startXPeer(t, exts)
265+ x, err := Boot(fd, testLog())
266+ require.NoError(t, err)
267+ t.Cleanup(x.CloseConn)
268+ h := newMockhost(t)
269+ src := newMockfdSource(t)
270+ src.EXPECT().Remove().Maybe()
271+ post, _ := newPost()
272+ x.attach(src, h, post)
273+ hs := &harness{t: t, x: x, p: p, h: h, ready: map[uint32]WindowInfo{}}
274+ const win = 0x500001
275+ hs.classic(win)
276+ p.set(func(p *xpeer) { delete(p.props[win], p.atoms["_NET_WM_PID"]) })
277+ hs.mapAndWait(win)
278+ require.Zero(t, hs.count(func(r xpeerReq) bool { return r.major == 144 }))
279+}
280+
281+func TestMapFlowBadWindowOnPropertiesNeverReady(t *testing.T) {
282+ hs := newHarness(t, nil)
283+ const win = 0x500001
284+ hs.classic(win)
285+ hs.p.set(func(p *xpeer) { p.bad[win] = true })
286+ s := hs.create(win)
287+ hs.p.mapRequest(win)
288+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Errors >= uint64(propCount)+1 })
289+ require.Zero(t, hs.x.tab.rec(s).pending, "failed replies are no longer awaited")
290+ require.False(t, hs.x.tab.rec(s).ready)
291+ require.Zero(t, hs.x.Stats().Unattributed)
292+
293+ hs.h.EXPECT().Dissociate(s, true).Once()
294+ hs.p.destroyNotify(win)
295+ readUntil(t, hs.x, func() bool { return hs.x.Slot(win) == 0 })
296+}
297+
298+func TestMapRequestTwiceBeforeReadyAsksOnce(t *testing.T) {
299+ hs := newHarness(t, nil)
300+ const win = 0x500001
301+ hs.classic(win)
302+ hs.create(win)
303+ hs.p.holdReplies()
304+ hs.p.mapRequest(win)
305+ hs.p.mapRequest(win)
306+ hs.expectReady(win)
307+ hs.waitMap(win)
308+ hs.p.release()
309+ readUntil(t, hs.x, func() bool { _, ok := hs.ready[win]; return ok })
310+ require.Equal(t, 1, hs.count(func(r xpeerReq) bool { return r.major == opMapWindow && r.u32(4) == win }))
311+}
312+
313+func TestMapNotifyMarksMapped(t *testing.T) {
314+ hs := newHarness(t, nil)
315+ const win = 0x500001
316+ hs.classic(win)
317+ s := hs.mapAndWait(win)
318+ hs.p.mapNotify(win)
319+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).mapped })
320+}
321+
322+// Property changes after Ready.
323+
324+func (hs *harness) notify(win uint32, atom string, deleted bool) {
325+ hs.t.Helper()
326+ before := hs.x.Stats().Replies
327+ hs.p.propertyNotify(win, hs.p.atom(atom), deleted)
328+ if deleted {
329+ hs.p.propertyNotify(win, hs.p.atom("WM_PROTOCOLS"), false) // sentinel: one reply follows
330+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Replies > before })
331+ return
332+ }
333+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Replies > before })
334+}
335+
336+func TestPropertyChangedTitleReachesHostOnce(t *testing.T) {
337+ hs := newHarness(t, nil)
338+ const win = 0x500001
339+ hs.classic(win)
340+ s := hs.mapAndWait(win)
341+
342+ hs.h.EXPECT().Title(s, "renamed").Once()
343+ hs.str(win, "_NET_WM_NAME", hs.p.atom("UTF8_STRING"), "renamed")
344+ hs.notify(win, "_NET_WM_NAME", false)
345+ require.Equal(t, "renamed", hs.x.tab.rec(s).title)
346+
347+ // Same value again: no host call (the mock fails on an unexpected one).
348+ hs.notify(win, "_NET_WM_NAME", false)
349+
350+ // WM_NAME is ignored while _NET_WM_NAME is set.
351+ hs.p.setProp(win, uint32(xproto.AtomWmName), uint32(xproto.AtomString), 8, []byte("legacy"))
352+ before := hs.x.Stats().Events
353+ hs.p.propertyNotify(win, uint32(xproto.AtomWmName), false)
354+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Events > before })
355+ require.Equal(t, "renamed", hs.x.tab.rec(s).title)
356+}
357+
358+func TestPropertyNetNameDeletedFallsBackToWMName(t *testing.T) {
359+ hs := newHarness(t, nil)
360+ const win = 0x500001
361+ hs.classic(win)
362+ s := hs.mapAndWait(win)
363+ hs.p.set(func(p *xpeer) { delete(p.props[win], p.atoms["_NET_WM_NAME"]) })
364+ hs.h.EXPECT().Title(s, "old title").Once()
365+ hs.p.propertyNotify(win, hs.p.atom("_NET_WM_NAME"), true)
366+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).title == "old title" })
367+}
368+
369+func TestPropertyClassChangeReachesHost(t *testing.T) {
370+ hs := newHarness(t, nil)
371+ const win = 0x500001
372+ hs.classic(win)
373+ s := hs.mapAndWait(win)
374+ hs.h.EXPECT().AppID(s, "Other").Once()
375+ hs.p.setProp(win, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("i\x00Other\x00"))
376+ hs.p.propertyNotify(win, uint32(xproto.AtomWmClass), false)
377+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).class == "Other" })
378+}
379+
380+func TestPropertyTransientChangeReachesHost(t *testing.T) {
381+ hs := newHarness(t, nil)
382+ const a, b = 0x500001, 0x500002
383+ hs.classic(a)
384+ as := hs.mapAndWait(a)
385+ hs.classic(b)
386+ bs := hs.mapAndWait(b)
387+ hs.h.EXPECT().Parent(bs, as).Once()
388+ hs.p.setProp(b, uint32(xproto.AtomWmTransientFor), uint32(xproto.AtomWindow), 32, le32(a))
389+ hs.p.propertyNotify(b, uint32(xproto.AtomWmTransientFor), false)
390+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(bs).transient == a })
391+}
392+
393+func TestPropertyFullscreenStateChangeReachesHost(t *testing.T) {
394+ hs := newHarness(t, nil)
395+ const win = 0x500001
396+ hs.classic(win)
397+ s := hs.mapAndWait(win)
398+ hs.h.EXPECT().Fullscreen(s, true).Once()
399+ hs.atoms(win, "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN")
400+ hs.p.propertyNotify(win, hs.p.atom("_NET_WM_STATE"), false)
401+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).fullscreen })
402+}
403+
404+func TestPropertyInputProtocolsAndHints(t *testing.T) {
405+ hs := newHarness(t, nil)
406+ const win = 0x500001
407+ hs.classic(win)
408+ hs.atoms(win, "WM_PROTOCOLS", "WM_DELETE_WINDOW", "WM_TAKE_FOCUS")
409+ hs.p.setProp(win, uint32(xproto.AtomWmHints), uint32(xproto.AtomWmHints), 32, le32(hintInput, 0, 0, 0, 0, 0, 0, 0, 0))
410+ s := hs.mapAndWait(win)
411+ r := hs.x.tab.rec(s)
412+ require.True(t, r.deleteWindow)
413+ require.True(t, r.takeFocus)
414+ require.False(t, r.input, "WM_HINTS input = false")
415+
416+ // No WM_HINTS: input defaults to true.
417+ const other = 0x500002
418+ hs.classic(other)
419+ o := hs.mapAndWait(other)
420+ require.True(t, hs.x.tab.rec(o).input)
421+ require.False(t, hs.x.tab.rec(o).deleteWindow)
422+}
423+
424+func TestPropertyUnwatchedAtomAsksNothing(t *testing.T) {
425+ hs := newHarness(t, nil)
426+ const win = 0x500001
427+ hs.classic(win)
428+ hs.mapAndWait(win)
429+ n := len(hs.p.requests())
430+ hs.p.propertyNotify(win, hs.p.atom("_MOTIF_WM_HINTS"), false)
431+ hs.p.propertyNotify(0x999999, hs.p.atom("_NET_WM_NAME"), false) // unknown window
432+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Events >= 2 })
433+ require.Len(t, hs.p.requests(), n)
434+}
435+
436+// Pairing.
437+
438+func (hs *harness) serialMsg(win uint32, serial uint64) {
439+ hs.p.clientMessage(win, hs.p.atom("WL_SURFACE_SERIAL"), uint32(serial), uint32(serial>>32))
440+ hs.t.Helper()
441+ before := hs.x.Stats().Events
442+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Events > before })
443+}
444+
445+func TestPairingSerialBeforeSetSerial(t *testing.T) {
446+ hs := newHarness(t, nil)
447+ const win = 0x500001
448+ hs.classic(win)
449+ s := hs.mapAndWait(win)
450+ hs.serialMsg(win, 0x1_0000_0002)
451+ require.EqualValues(t, 0x1_0000_0002, hs.x.tab.rec(s).serial, "high word in data32[1]")
452+ hs.h.EXPECT().Associate(s, uint64(99)).Once()
453+ hs.x.SetSerial(99, 0x1_0000_0002)
454+ require.EqualValues(t, 99, hs.x.tab.rec(s).surface)
455+ require.Zero(t, hs.x.unpairedN)
456+}
457+
458+func TestPairingSetSerialBeforeSerial(t *testing.T) {
459+ hs := newHarness(t, nil)
460+ const win = 0x500001
461+ hs.classic(win)
462+ s := hs.mapAndWait(win)
463+ hs.x.SetSerial(99, 7)
464+ require.Equal(t, 1, hs.x.unpairedN)
465+ hs.h.EXPECT().Associate(s, uint64(99)).Once()
466+ hs.serialMsg(win, 7)
467+ require.Zero(t, hs.x.unpairedN)
468+}
469+
470+func TestPairingWaitsForReady(t *testing.T) {
471+ hs := newHarness(t, nil)
472+ const win = 0x500001
473+ hs.classic(win)
474+ s := hs.create(win)
475+ hs.x.SetSerial(5, 3)
476+ hs.serialMsg(win, 3) // not mapped yet: no Associate (the mock fails on one)
477+ require.Zero(t, hs.x.tab.rec(s).surface)
478+
479+ hs.h.EXPECT().Associate(s, uint64(5)).Once()
480+ hs.expectReady(win)
481+ hs.p.mapRequest(win)
482+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).surface != 0 })
483+}
484+
485+func TestPairingSerialForUnknownWindowIgnored(t *testing.T) {
486+ hs := newHarness(t, nil)
487+ hs.x.SetSerial(5, 3)
488+ hs.serialMsg(0x888888, 3)
489+ require.Equal(t, 1, hs.x.unpairedN, "stays unpaired")
490+}
491+
492+func TestPairingSurfaceGoneBeforePair(t *testing.T) {
493+ hs := newHarness(t, nil)
494+ const win = 0x500001
495+ hs.classic(win)
496+ s := hs.mapAndWait(win)
497+ hs.x.SetSerial(5, 3)
498+ hs.x.SurfaceGone(5)
499+ require.Zero(t, hs.x.unpairedN)
500+ hs.serialMsg(win, 3) // the surface is gone: nothing to pair with
501+ require.Zero(t, hs.x.tab.rec(s).surface)
502+}
503+
504+func TestPairingSurfaceGoneAfterPairClearsLink(t *testing.T) {
505+ hs := newHarness(t, nil)
506+ const win = 0x500001
507+ hs.classic(win)
508+ s := hs.mapAndWait(win)
509+ hs.serialMsg(win, 3)
510+ hs.h.EXPECT().Associate(s, uint64(5)).Once()
511+ hs.x.SetSerial(5, 3)
512+ hs.x.SurfaceGone(5)
513+ require.Zero(t, hs.x.tab.rec(s).surface)
514+}
515+
516+func TestPairingDuplicateSerialIgnored(t *testing.T) {
517+ hs := newHarness(t, nil)
518+ const win = 0x500001
519+ hs.classic(win)
520+ s := hs.mapAndWait(win)
521+ hs.serialMsg(win, 3)
522+ hs.serialMsg(win, 4)
523+ require.EqualValues(t, 3, hs.x.tab.rec(s).serial)
524+ hs.x.SetSerial(8, 4) // nobody announces 4: stays unpaired
525+ require.Equal(t, 1, hs.x.unpairedN)
526+}
527+
528+func TestPairingUnmanagedKeepsSurfaceWithoutAssociate(t *testing.T) {
529+ hs := newHarness(t, nil)
530+ hs.p.createNotify(0x500009, true)
531+ readUntil(t, hs.x, func() bool { return hs.x.Slot(0x500009) != 0 })
532+ hs.serialMsg(0x500009, 3)
533+ hs.x.SetSerial(5, 3) // the mock fails on an Associate
534+ require.EqualValues(t, 5, hs.x.tab.rec(hs.x.Slot(0x500009)).surface)
535+}
536+
537+func TestPairingTableOverflowDropsOldest(t *testing.T) {
538+ hs := newHarness(t, nil)
539+ for i := uint64(1); i <= unpairedCap+1; i++ {
540+ hs.x.SetSerial(100+i, i)
541+ }
542+ require.Equal(t, unpairedCap, hs.x.unpairedN)
543+ for i := 0; i < hs.x.unpairedN; i++ {
544+ require.NotEqual(t, uint64(1), hs.x.unpaired[i].serial, "oldest dropped")
545+ }
546+}
547+
548+func TestPairingZeroSerialIgnored(t *testing.T) {
549+ hs := newHarness(t, nil)
550+ hs.x.SetSerial(5, 0)
551+ require.Zero(t, hs.x.unpairedN)
552+}
553+
554+func TestLegacySurfaceIDCountedAndIgnored(t *testing.T) {
555+ hs := newHarness(t, nil)
556+ const win = 0x500001
557+ hs.classic(win)
558+ s := hs.mapAndWait(win)
559+ hs.p.clientMessage(win, hs.p.atom("WL_SURFACE_ID"), 12)
560+ readUntil(t, hs.x, func() bool { return hs.x.Stats().LegacyID == 1 })
561+ require.Zero(t, hs.x.tab.rec(s).serial)
562+}
563+
564+func TestNetWMStateClientMessageForwardsFullscreen(t *testing.T) {
565+ hs := newHarness(t, nil)
566+ const win = 0x500001
567+ hs.classic(win)
568+ s := hs.mapAndWait(win)
569+ hs.h.EXPECT().Fullscreen(s, true).Once()
570+ hs.p.clientMessage(win, hs.p.atom("_NET_WM_STATE"), 1, hs.p.atom("_NET_WM_STATE_FULLSCREEN"))
571+ readUntil(t, hs.x, func() bool { return hs.x.tab.rec(s).fullscreen })
572+ hs.h.EXPECT().Fullscreen(s, false).Once() // toggle
573+ hs.p.clientMessage(win, hs.p.atom("_NET_WM_STATE"), 2, hs.p.atom("_NET_WM_STATE_FULLSCREEN"))
574+ readUntil(t, hs.x, func() bool { return !hs.x.tab.rec(s).fullscreen })
575+ // Not written back by the message itself.
576+ st, ok := hs.p.prop(win, "_NET_WM_STATE")
577+ require.True(t, ok)
578+ require.Empty(t, st.data)
579+}
580+
581+// Unmap, destroy, remap.
582+
583+func TestUnmapDissociatesAndRemapRereadsProperties(t *testing.T) {
584+ hs := newHarness(t, nil)
585+ const win = 0x500001
586+ hs.classic(win)
587+ s := hs.mapAndWait(win)
588+
589+ // A synthetic UnmapNotify (ICCCM withdraw request) is not an unmap.
590+ hs.p.unmapNotify(win, true)
591+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Events >= 2 })
592+ require.True(t, hs.x.tab.rec(s).ready)
593+
594+ hs.h.EXPECT().Dissociate(s, false).Once()
595+ hs.p.unmapNotify(win, false)
596+ readUntil(t, hs.x, func() bool { return !hs.x.tab.rec(s).ready })
597+ r := hs.x.tab.rec(s)
598+ require.False(t, r.mapping)
599+ require.Zero(t, r.serial)
600+ hs.p.waitReq(0, func(q xpeerReq) bool {
601+ return q.major == opSetInputFocus || q.major == opChangeProperty && q.u32(4) == win
602+ })
603+ readUntil(t, hs.x, func() bool {
604+ v, ok := hs.p.prop(win, "WM_STATE")
605+ return ok && len(v.data) == 8 && binary.LittleEndian.Uint32(v.data) == 0
606+ })
607+ _, ok := hs.p.prop(win, "_NET_WM_STATE")
608+ require.False(t, ok, "_NET_WM_STATE deleted")
609+ list, _ := hs.p.prop(peerRoot, "_NET_CLIENT_LIST")
610+ require.Empty(t, list.data)
611+
612+ // Remap starts over.
613+ delete(hs.ready, win)
614+ hs.expectReady(win)
615+ n := hs.count(func(q xpeerReq) bool { return q.major == opGetProperty && q.u32(4) == win })
616+ hs.p.mapRequest(win)
617+ readUntil(t, hs.x, func() bool { _, ok := hs.ready[win]; return ok })
618+ require.Equal(t, n+propCount, hs.count(func(q xpeerReq) bool { return q.major == opGetProperty && q.u32(4) == win }))
619+ list, _ = hs.p.prop(peerRoot, "_NET_CLIENT_LIST")
620+ require.Equal(t, []uint32{win}, atomsOf(list))
621+}
622+
623+func TestDestroyWhileMappingNeverReady(t *testing.T) {
624+ hs := newHarness(t, nil)
625+ const win = 0x500001
626+ hs.classic(win)
627+ s := hs.create(win)
628+ hs.p.holdReplies()
629+ hs.p.mapRequest(win)
630+ hs.waitMap(win)
631+ hs.h.EXPECT().Dissociate(s, true).Once()
632+ hs.p.destroyNotify(win)
633+ readUntil(t, hs.x, func() bool { return hs.x.Slot(win) == 0 })
634+ replies := hs.x.Stats().Replies
635+ hs.p.release() // replies for a window that is gone: xturbo retired their slots
636+ readUntil(t, hs.x, func() bool { return hs.x.conn.Stats().DroppedReplies >= uint64(propCount) })
637+ require.Equal(t, replies, hs.x.Stats().Replies, "none reaches the XWM")
638+}
639+
640+func TestStaleRepliesAfterSlotReuseAreIgnored(t *testing.T) {
641+ hs := newHarness(t, nil)
642+ const old, fresh = 0x500001, 0x500002
643+ hs.classic(old)
644+ hs.classic(fresh)
645+ s := hs.create(old)
646+ hs.p.holdReplies()
647+ hs.p.mapRequest(old)
648+ hs.waitMap(old)
649+ hs.h.EXPECT().Dissociate(s, true).Once()
650+ hs.p.destroyNotify(old)
651+ readUntil(t, hs.x, func() bool { return hs.x.Slot(old) == 0 })
652+
653+ hs.expectCreated(fresh)
654+ hs.p.createNotify(fresh, false)
655+ readUntil(t, hs.x, func() bool { return hs.x.Slot(fresh) != 0 })
656+ require.Equal(t, s, hs.x.Slot(fresh), "the freed slot is reused")
657+
658+ hs.p.release()
659+ readUntil(t, hs.x, func() bool { return hs.x.conn.Stats().DroppedReplies >= uint64(propCount) })
660+
661+ // A reply that does get through with the old tag (slot reused, generation
662+ // bumped) is ignored.
663+ oldTag := s | Slot(hs.x.tab.rec(s).gen-1)<<16
664+ rep := make([]byte, 32)
665+ rep[0] = 1
666+ hs.x.onReply(&xturbo.Reply{Kind: kindProp, Args: [4]uint32{uint32(oldTag), propClass}, Raw: rep})
667+ hs.x.onReply(&xturbo.Reply{Kind: kindGeom, Args: [4]uint32{uint32(oldTag)}, Raw: rep})
668+ require.EqualValues(t, 2, hs.x.Stats().Stale)
669+ require.False(t, hs.x.tab.rec(s).ready, "stale replies must not complete the new window")
670+ require.Zero(t, hs.x.tab.rec(s).pending)
671+}
672+
673+// Reparenting.
674+
675+func TestReparentAwayFromRootRemovesManagedWindow(t *testing.T) {
676+ hs := newHarness(t, nil)
677+ const win = 0x500001
678+ hs.classic(win)
679+ s := hs.mapAndWait(win)
680+ hs.h.EXPECT().Dissociate(s, true).Once()
681+ hs.p.reparentNotify(win, 0x600000)
682+ readUntil(t, hs.x, func() bool { return hs.x.Slot(win) == 0 })
683+ list, _ := hs.p.prop(peerRoot, "_NET_CLIENT_LIST")
684+ require.Empty(t, list.data)
685+ require.Zero(t, hs.x.tab.n)
686+}
687+
688+func TestReparentAwayOfUnmanagedWindowRemovesIt(t *testing.T) {
689+ hs := newHarness(t, nil)
690+ hs.p.createNotify(0x500009, true)
691+ readUntil(t, hs.x, func() bool { return hs.x.Slot(0x500009) != 0 })
692+ hs.p.reparentNotify(0x500009, 0x600000)
693+ readUntil(t, hs.x, func() bool { return hs.x.Slot(0x500009) == 0 })
694+}
695+
696+func TestReparentIntoRootAdoptsWindow(t *testing.T) {
697+ hs := newHarness(t, nil)
698+ const win = 0x500001
699+ hs.expectCreated(win)
700+ hs.p.reparentNotify(win, peerRoot)
701+ readUntil(t, hs.x, func() bool { return hs.x.Slot(win) != 0 })
702+ require.Equal(t, kindManaged, hs.x.tab.rec(hs.x.Slot(win)).kind)
703+
704+ // Already known: no second Created.
705+ hs.p.reparentNotify(win, peerRoot)
706+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Events >= 2 })
707+}
708+
709+func TestReparentIntoRootOfOverrideRedirectWindowStaysUnmanaged(t *testing.T) {
710+ hs := newHarness(t, nil)
711+ hs.p.event(21, func(b *[32]byte) {
712+ binary.LittleEndian.PutUint32(b[4:], peerRoot)
713+ binary.LittleEndian.PutUint32(b[8:], 0x500009)
714+ binary.LittleEndian.PutUint32(b[12:], peerRoot)
715+ b[20] = 1
716+ })
717+ readUntil(t, hs.x, func() bool { return hs.x.Slot(0x500009) != 0 })
718+ require.Equal(t, kindUnmanaged, hs.x.tab.rec(hs.x.Slot(0x500009)).kind)
719+}
720+
721+func TestReparentOfWMWindowIgnored(t *testing.T) {
722+ hs := newHarness(t, nil)
723+ hs.p.reparentNotify(hs.x.wmWin, peerRoot)
724+ readUntil(t, hs.x, func() bool { return hs.x.Stats().Events >= 1 })
725+ require.Zero(t, hs.x.Slot(hs.x.wmWin))
726+}
727+
728+// Window known only before Attach: Attach replays the map flow.
729+func TestAttachMapsWindowsRequestedBeforeAttach(t *testing.T) {
730+ x, p := bootPeer(t, nil)
731+ const win = 0x500001
732+ p.setProp(win, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("a\x00B\x00"))
733+ p.createNotify(win, false)
734+ p.mapRequest(win)
735+ readUntil(t, x, func() bool { return x.Stats().Events >= 2 })
736+ h := newMockhost(t)
737+ src := newMockfdSource(t)
738+ src.EXPECT().Remove().Maybe()
739+ post, _ := newPost()
740+ var got WindowInfo
741+ done := false
742+ h.EXPECT().Created(mock.Anything, uint32(win)).Return(ports.WindowID(1)).Once()
743+ h.EXPECT().Ready(mock.Anything, mock.Anything).Run(func(_ Slot, i WindowInfo) { got, done = i, true }).Once()
744+ x.attach(src, h, post)
745+ readUntil(t, x, func() bool { return done })
746+ require.Equal(t, "B", got.AppID)
747+}
748+
749+// Replies complete a map in any order (a server may answer the geometry
750+// before the properties it was asked for first): Ready fires on the last one.
751+func TestMapFlowReadyFiresOnLastReplyInAnyOrder(t *testing.T) {
752+ hs := newHarness(t, nil)
753+ const win = 0x500001
754+ hs.classic(win)
755+ s := hs.create(win)
756+ r := hs.x.tab.rec(s)
757+ r.mapping, r.pending = true, propMaskAll&^propClientIDs
758+ hs.expectReady(win)
759+ order := []int{propCount, propPID, propClass, propNetName, propName, propHints, propNormalHints, propProtocols, propTransientFor, propWindowType, propState}
760+ for i, bit := range order {
761+ require.False(t, hs.x.tab.rec(s).ready, i)
762+ if bit == propCount { // the geometry
763+ hs.x.tab.rec(s).w, hs.x.tab.rec(s).h = 300, 200
764+ hs.x.tab.rec(s).pending &^= propGeom
765+ hs.x.checkReady(s)
766+ continue
767+ }
768+ var val []byte
769+ var format uint8 = 8
770+ switch bit {
771+ case propClass:
772+ val = []byte("a\x00B\x00")
773+ case propNetName:
774+ val = []byte("t")
775+ case propPID:
776+ val, format = le32(5), 32
777+ default:
778+ format = 32
779+ }
780+ x := hs.x
781+ x.applyProp(s, bit, format, val)
782+ x.tab.rec(s).pending &^= 1 << bit
783+ x.checkReady(s)
784+ }
785+ require.True(t, hs.x.tab.rec(s).ready)
786+ require.Equal(t, "B", hs.ready[win].AppID)
787+ require.Equal(t, "t", hs.ready[win].Title)
788+ require.Equal(t, 5, hs.ready[win].PID)
789+}
M internal/adapters/wayland/xwm/props.go +305 -7
@@ -1,12 +1,17 @@
11 package xwm
22
33 import (
4+ "bytes"
5+ "encoding/binary"
6+
47 "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/res"
59 "bnema.dev/xturbo/xproto"
610 )
711
812 // Property indices (second Expect argument of kindProp) and their bits in
9-// record.pending. propGeom is the GetGeometry bit.
13+// record.pending. propGeom is the GetGeometry bit; propClientIDs is raised
14+// while a QueryClientIds reply stands in for a missing _NET_WM_PID.
1015 const (
1116 propClass = iota
1217 propName
@@ -22,14 +27,307 @@ const (
2227 )
2328
2429 const (
25- propGeom uint16 = 1 << propCount
30+ propGeom uint16 = 1 << propCount
31+ propClientIDs uint16 = propGeom << 1
32+ // propMaskAll is what a map waits for: every property and the geometry.
2633 propMaskAll uint16 = propGeom<<1 - 1
2734 )
2835
29-// onPropertyNotify handles a changed property of a managed window.
30-func (x *XWM) onPropertyNotify(ev *xturbo.Event) { _ = ev }
36+// WM_NORMAL_HINTS flags and WM_HINTS flags.
37+const (
38+ hintInput = 1 << 0
39+ hintMinSize = 1 << 4
40+ hintMaxSize = 1 << 5
41+)
42+
43+// maxPropWords bounds one GetProperty (4 KiB), so titles are truncated there.
44+const maxPropWords = 1024
45+
46+// propIndex maps a property atom to its index, or -1 when it is not watched.
47+func (x *XWM) propIndex(a uint32) int {
48+ switch a {
49+ case uint32(xproto.AtomWmClass):
50+ return propClass
51+ case uint32(xproto.AtomWmName):
52+ return propName
53+ case uint32(xproto.AtomWmHints):
54+ return propHints
55+ case uint32(xproto.AtomWmNormalHints):
56+ return propNormalHints
57+ case uint32(xproto.AtomWmTransientFor):
58+ return propTransientFor
59+ case x.atoms[atomNetWMName]:
60+ return propNetName
61+ case x.atoms[atomWMProtocols]:
62+ return propProtocols
63+ case x.atoms[atomNetWMWindowType]:
64+ return propWindowType
65+ case x.atoms[atomNetWMState]:
66+ return propState
67+ case x.atoms[atomNetWMPID]:
68+ return propPID
69+ }
70+ return -1
71+}
72+
73+func (x *XWM) propAtom(idx int) xproto.Atom {
74+ switch idx {
75+ case propClass:
76+ return xproto.AtomWmClass
77+ case propName:
78+ return xproto.AtomWmName
79+ case propHints:
80+ return xproto.AtomWmHints
81+ case propNormalHints:
82+ return xproto.AtomWmNormalHints
83+ case propTransientFor:
84+ return xproto.AtomWmTransientFor
85+ case propNetName:
86+ return xproto.Atom(x.atoms[atomNetWMName])
87+ case propProtocols:
88+ return xproto.Atom(x.atoms[atomWMProtocols])
89+ case propWindowType:
90+ return xproto.Atom(x.atoms[atomNetWMWindowType])
91+ case propState:
92+ return xproto.Atom(x.atoms[atomNetWMState])
93+ default:
94+ return xproto.Atom(x.atoms[atomNetWMPID])
95+ }
96+}
97+
98+// requestProp queues a GetProperty for property idx of s.
99+func (x *XWM) requestProp(s Slot, idx int) {
100+ rec := x.tab.rec(s)
101+ seq := xproto.GetProperty(x.conn.Buf(), false, xproto.Window(rec.xid), x.propAtom(idx), xproto.AtomAny, 0, maxPropWords)
102+ rec.pending |= 1 << idx
103+ x.expect(seq, kindProp, x.tab.tag(s), uint32(idx))
104+}
105+
106+// onPropertyNotify handles a changed property of a managed window that is
107+// being mapped or is mapped; unwatched atoms cost nothing.
108+func (x *XWM) onPropertyNotify(ev *xturbo.Event) {
109+ e := xproto.PropertyNotifyOf(ev)
110+ s := x.tab.lookup(uint32(e.Window()))
111+ if s == 0 {
112+ return
113+ }
114+ if rec := x.tab.rec(s); rec.kind != kindManaged || !rec.mapping {
115+ return
116+ }
117+ idx := x.propIndex(uint32(e.Atom()))
118+ if idx < 0 {
119+ return
120+ }
121+ if e.State() == xproto.PropertyDelete {
122+ x.applyProp(s, idx, 0, nil)
123+ return
124+ }
125+ x.requestProp(s, idx)
126+}
127+
128+// onPropReply decodes one GetProperty reply into the record. An absent
129+// property (format 0) clears its fields.
130+func (x *XWM) onPropReply(s Slot, _ *record, r *xturbo.Reply) {
131+ idx := int(r.Args[1])
132+ if idx < 0 || idx >= propCount {
133+ return
134+ }
135+ var format uint8
136+ var val []byte
137+ if rep, ok := xproto.ParseGetPropertyReply(r.Raw); ok {
138+ format, val = rep.Format(), rep.Value()
139+ }
140+ x.applyProp(s, idx, format, val)
141+ x.tab.rec(s).pending &^= 1 << idx
142+ x.checkReady(s)
143+}
144+
145+func word(b []byte, i int) uint32 { return binary.LittleEndian.Uint32(b[4*i:]) }
146+
147+// applyProp stores one decoded property. It does not allocate unless a string
148+// changed. Host calls come last: the record is not touched after them.
149+func (x *XWM) applyProp(s Slot, idx int, format uint8, val []byte) {
150+ rec := x.tab.rec(s)
151+ if idx == propClass || idx == propName || idx == propNetName {
152+ if format != 8 {
153+ val = nil
154+ }
155+ } else if format != 32 {
156+ val = nil
157+ }
158+ switch idx {
159+ case propClass:
160+ inst, class := val, []byte(nil)
161+ if i := bytes.IndexByte(val, 0); i >= 0 {
162+ inst, class = val[:i], val[i+1:]
163+ if j := bytes.IndexByte(class, 0); j >= 0 {
164+ class = class[:j]
165+ }
166+ }
167+ app := class
168+ if len(app) == 0 {
169+ app = inst
170+ }
171+ if rec.class == string(app) {
172+ return
173+ }
174+ rec.class = string(app)
175+ if rec.ready {
176+ x.host.AppID(s, rec.class)
177+ }
178+ case propName:
179+ if !rec.hasNetName {
180+ x.setTitle(s, val)
181+ }
182+ case propNetName:
183+ had := rec.hasNetName
184+ rec.hasNetName = len(val) > 0
185+ if rec.hasNetName {
186+ x.setTitle(s, val)
187+ } else if had && rec.mapping {
188+ x.requestProp(s, propName)
189+ }
190+ case propHints:
191+ rec.input = true
192+ if len(val) >= 8 && word(val, 0)&hintInput != 0 {
193+ rec.input = word(val, 1) != 0
194+ }
195+ case propNormalHints:
196+ rec.minW, rec.minH, rec.maxW, rec.maxH = 0, 0, 0, 0
197+ if len(val) >= 36 {
198+ fl := word(val, 0)
199+ if fl&hintMinSize != 0 {
200+ rec.minW, rec.minH = int32(word(val, 5)), int32(word(val, 6))
201+ }
202+ if fl&hintMaxSize != 0 {
203+ rec.maxW, rec.maxH = int32(word(val, 7)), int32(word(val, 8))
204+ }
205+ }
206+ case propProtocols:
207+ rec.deleteWindow, rec.takeFocus = false, false
208+ for i := 0; i+4 <= len(val); i += 4 {
209+ switch binary.LittleEndian.Uint32(val[i:]) {
210+ case x.atoms[atomWMDeleteWindow]:
211+ rec.deleteWindow = true
212+ case x.atoms[atomWMTakeFocus]:
213+ rec.takeFocus = true
214+ }
215+ }
216+ case propTransientFor:
217+ var t uint32
218+ if len(val) >= 4 {
219+ t = word(val, 0)
220+ }
221+ if t == rec.transient {
222+ return
223+ }
224+ rec.transient = t
225+ if rec.ready {
226+ x.host.Parent(s, x.managedSlot(t))
227+ }
228+ case propWindowType:
229+ rec.wtype = 0
230+ for i := 0; i+4 <= len(val); i += 4 {
231+ if t := x.windowType(binary.LittleEndian.Uint32(val[i:])); t != 0 {
232+ rec.wtype = t
233+ break
234+ }
235+ }
236+ case propState:
237+ var modal, fs bool
238+ for i := 0; i+4 <= len(val); i += 4 {
239+ switch binary.LittleEndian.Uint32(val[i:]) {
240+ case x.atoms[atomNetWMStateModal]:
241+ modal = true
242+ case x.atoms[atomNetWMStateFullscreen]:
243+ fs = true
244+ }
245+ }
246+ changed := fs != rec.fullscreen
247+ rec.modal, rec.fullscreen = modal, fs
248+ if changed && rec.ready {
249+ x.host.Fullscreen(s, fs)
250+ }
251+ case propPID:
252+ if len(val) >= 4 {
253+ rec.pid = int32(word(val, 0))
254+ return
255+ }
256+ rec.pid = 0
257+ if !rec.ready && rec.pending&propClientIDs == 0 && x.conn.Ext().Info(xturbo.ExtRes).Present {
258+ x.queryClientIDs(s)
259+ }
260+ }
261+}
262+
263+// setTitle stores a title when it differs; only a change allocates.
264+func (x *XWM) setTitle(s Slot, val []byte) {
265+ rec := x.tab.rec(s)
266+ if rec.title == string(val) {
267+ return
268+ }
269+ rec.title = string(val)
270+ if rec.ready {
271+ x.host.Title(s, rec.title)
272+ }
273+}
274+
275+// windowType returns the atom enum of a recognised _NET_WM_WINDOW_TYPE atom,
276+// or 0.
277+func (x *XWM) windowType(a uint32) uint8 {
278+ for t := atomNetWMWindowTypeNormal; t <= atomNetWMWindowTypeDND; t++ {
279+ if x.atoms[t] == a {
280+ return uint8(t)
281+ }
282+ }
283+ return 0
284+}
285+
286+// floatingType reports whether a window type floats by itself.
287+func floatingType(t uint8) bool {
288+ switch int(t) {
289+ case atomNetWMWindowTypeDialog, atomNetWMWindowTypeUtility, atomNetWMWindowTypeSplash, atomNetWMWindowTypeToolbar:
290+ return true
291+ }
292+ return false
293+}
294+
295+// managedSlot returns the slot of the managed window xid, or 0.
296+func (x *XWM) managedSlot(xid uint32) Slot {
297+ if xid == 0 {
298+ return 0
299+ }
300+ if s := x.tab.lookup(xid); s != 0 && x.tab.rec(s).kind == kindManaged {
301+ return s
302+ }
303+ return 0
304+}
31305
32-// onPropReply decodes one GetProperty reply into the record.
33-func (x *XWM) onPropReply(s Slot, rec *record, r *xturbo.Reply) { _, _, _ = s, rec, r }
306+// queryClientIDs asks XRes for the PID of the client owning s, which stands
307+// in for a missing _NET_WM_PID: Ready waits for it (propClientIDs).
308+func (x *XWM) queryClientIDs(s Slot) {
309+ rec := x.tab.rec(s)
310+ specs := [1]res.ClientIdSpec{{Client: rec.xid, Mask: res.ClientIdMaskLocalClientPID}}
311+ seq := res.QueryClientIds(x.conn.Buf(), specs[:])
312+ if seq == 0 {
313+ return
314+ }
315+ rec.pending |= propClientIDs
316+ x.expect(seq, kindClientIds, x.tab.tag(s), 0)
317+}
34318
35-var _ = xproto.AtomWmClass
319+// onClientIdsReply stores the PID XRes found and releases the map.
320+func (x *XWM) onClientIdsReply(s Slot, rec *record, r *xturbo.Reply) {
321+ if q, ok := res.ParseQueryClientIdsReply(r.Raw); ok {
322+ it := q.Ids()
323+ for it.Next() {
324+ v := it.Value()
325+ if v.Spec().Mask == res.ClientIdMaskLocalClientPID && v.Value().Len() > 0 {
326+ rec.pid = int32(v.Value().At(0))
327+ break
328+ }
329+ }
330+ }
331+ rec.pending &^= propClientIDs
332+ x.checkReady(s)
333+}
A internal/adapters/wayland/xwm/streams_test.go +178 -0
@@ -0,0 +1,178 @@
1+package xwm
2+
3+import (
4+ "encoding/hex"
5+ "os"
6+ "path/filepath"
7+ "runtime"
8+ "strings"
9+ "testing"
10+ "time"
11+
12+ "bnema.dev/xturbo/xproto"
13+ "github.com/stretchr/testify/require"
14+)
15+
16+// The recorded streams are the bytes an X server wrote to the XWM during a
17+// steady-state session of one mapped window, captured from the scripted xpeer
18+// (real encoded X packets: events, GetProperty replies). The scenario is
19+// deterministic, so a replay meets the request sequence numbers it recorded.
20+// They are not xtrace captures of a real Xwayland: xpeer speaks the same wire
21+// protocol and keeps the fixture reproducible. Regenerate with
22+//
23+// XWM_UPDATE_STREAMS=1 go test ./internal/adapters/wayland/xwm -run TestRecordedStreams
24+const (
25+ streamCycles = 400
26+ streamWarm = 20 // cycles replayed before measuring
27+)
28+
29+const streamWin = 0x500001
30+
31+type streamKind struct {
32+ name string
33+ // perCycle is Events+Replies the XWM sees per cycle.
34+ perCycle int
35+ cycle func(hs *harness)
36+}
37+
38+var streamKinds = []streamKind{
39+ // A title notification the XWM answers with one GetProperty whose reply
40+ // equals the stored title.
41+ {"property_unchanged", 2, func(hs *harness) {
42+ before := hs.x.Stats().Replies
43+ hs.p.propertyNotify(streamWin, hs.p.atom("_NET_WM_NAME"), false)
44+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Replies > before })
45+ }},
46+ // The same plus ConfigureNotify, FocusIn and MapNotify.
47+ {"steady", 5, func(hs *harness) {
48+ before := hs.x.Stats().Replies
49+ hs.p.propertyNotify(streamWin, hs.p.atom("_NET_WM_NAME"), false)
50+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Replies > before })
51+ events := hs.x.Stats().Events
52+ hs.p.configureNotify(streamWin)
53+ hs.p.focusIn(streamWin)
54+ hs.p.mapNotify(streamWin)
55+ readUntil(hs.t, hs.x, func() bool { return hs.x.Stats().Events >= events+3 })
56+ }},
57+}
58+
59+// streamScenario boots, maps one window and parks the peer behind a poke so
60+// nothing but the test writes to the XWM afterwards (an allocation count is
61+// process-wide). The poke is part of the scenario, recorded or replayed.
62+func streamScenario(t *testing.T) *harness {
63+ t.Helper()
64+ hs := newHarness(t, nil)
65+ hs.classic(streamWin)
66+ hs.mapAndWait(streamWin)
67+ return hs
68+}
69+
70+func poke(hs *harness) {
71+ hs.t.Helper()
72+ n := len(hs.p.requests())
73+ xproto.GetInputFocus(hs.x.conn.Buf())
74+ hs.x.flush()
75+ hs.p.waitReq(n, func(r xpeerReq) bool { return r.major == opGetInputFocus })
76+}
77+
78+func recordStream(t *testing.T, k streamKind) []byte {
79+ hs := streamScenario(t)
80+ poke(hs)
81+ hs.p.mu.Lock()
82+ hs.p.record = true
83+ hs.p.mu.Unlock()
84+ for i := 0; i < streamCycles; i++ {
85+ k.cycle(hs)
86+ }
87+ hs.p.mu.Lock()
88+ defer hs.p.mu.Unlock()
89+ hs.p.record = false
90+ return append([]byte(nil), hs.p.tap...)
91+}
92+
93+func streamPath(k streamKind) string {
94+ return filepath.Join("testdata", "streams", k.name+".hex")
95+}
96+
97+func loadStream(t *testing.T, k streamKind) []byte {
98+ t.Helper()
99+ text, err := os.ReadFile(streamPath(k))
100+ require.NoError(t, err)
101+ b, err := hex.DecodeString(strings.Join(strings.Fields(string(text)), ""))
102+ require.NoError(t, err)
103+ return b
104+}
105+
106+func encodeHex(b []byte) string {
107+ var sb strings.Builder
108+ for len(b) > 0 {
109+ n := min(32, len(b))
110+ sb.WriteString(hex.EncodeToString(b[:n]))
111+ sb.WriteByte('\n')
112+ b = b[n:]
113+ }
114+ return sb.String()
115+}
116+
117+func TestRecordedStreams(t *testing.T) {
118+ for _, k := range streamKinds {
119+ t.Run(k.name, func(t *testing.T) {
120+ got := recordStream(t, k)
121+ if os.Getenv("XWM_UPDATE_STREAMS") != "" {
122+ require.NoError(t, os.MkdirAll(filepath.Dir(streamPath(k)), 0o755))
123+ require.NoError(t, os.WriteFile(streamPath(k), []byte(encodeHex(got)), 0o644))
124+ }
125+ require.Equal(t, loadStream(t, k), got, "the committed stream no longer matches the protocol the XWM speaks")
126+ })
127+ }
128+}
129+
130+// replay feeds the recorded stream and reports the mallocs of the part after
131+// the warm-up cycles.
132+func replay(t *testing.T, k streamKind) (mallocs uint64, hs *harness) {
133+ t.Helper()
134+ stream := loadStream(t, k)
135+ hs = streamScenario(t)
136+ hs.p.pause()
137+ poke(hs)
138+ _, err := hs.p.f.Write(stream)
139+ require.NoError(t, err)
140+
141+ x := hs.x
142+ base := x.Stats().Events + x.Stats().Replies
143+ drive := func(until uint64) {
144+ deadline := time.Now().Add(10 * time.Second)
145+ for x.Stats().Events+x.Stats().Replies < until {
146+ if time.Now().After(deadline) { // no formatting arguments: boxing them would count as mallocs
147+ t.Fatal("stream stalled")
148+ }
149+ before := x.Stats().Events + x.Stats().Replies
150+ x.onReadable()
151+ if x.Stats().Events+x.Stats().Replies == before {
152+ runtime.Gosched()
153+ }
154+ }
155+ }
156+ drive(base + uint64(streamWarm*k.perCycle))
157+ target := base + uint64(streamCycles*k.perCycle)
158+
159+ var m0, m1 runtime.MemStats
160+ runtime.GC()
161+ runtime.ReadMemStats(&m0)
162+ drive(target)
163+ runtime.ReadMemStats(&m1)
164+ require.Equal(t, target, x.Stats().Events+x.Stats().Replies)
165+ return m1.Mallocs - m0.Mallocs, hs
166+}
167+
168+func TestPropertyUnchangedAllocations(t *testing.T) {
169+ m, hs := replay(t, streamKinds[0])
170+ require.Zero(t, m, "unchanged property cycles must not allocate")
171+ require.Equal(t, "net title", hs.x.tab.rec(hs.x.Slot(streamWin)).title)
172+}
173+
174+func TestDispatchAllocations(t *testing.T) {
175+ m, hs := replay(t, streamKinds[1])
176+ require.Zero(t, m, "steady-state event dispatch must not allocate")
177+ require.True(t, hs.x.tab.rec(hs.x.Slot(streamWin)).mapped)
178+}
M internal/adapters/wayland/xwm/table.go +4 -2
@@ -1,4 +1,4 @@
1-//lint:file-ignore U1000 the record fields below are filled by the map, property, configure and focus flows that build on this skeleton
1+//lint:file-ignore U1000 pend, sent and stateSent are used by the configure flow
22
33 package xwm
44
@@ -202,7 +202,9 @@ func (t *table) lookup(xid uint32) Slot {
202202 }
203203 }
204204
205-// rec returns the record of s, or nil when s is out of range.
205+// rec returns the record of s, or nil when s is out of range. The pointer is
206+// valid only until the next insert, host call or anything else that can grow
207+// the table or free s: never hold it across those, fetch it again with rec(s).
206208 func (t *table) rec(s Slot) *record {
207209 if s == 0 || int(s) > len(t.recs) {
208210 return nil
A internal/adapters/wayland/xwm/testdata/streams/property_unchanged.hex +950 -0
@@ -0,0 +1,950 @@
1+1c005f0001005000f30300000000000000000000000000000000000000000000
2+0108600003000000ef0300000000000009000000000000000000000000000000
3+6e6574207469746c650000001c00600001005000f30300000000000000000000
4+0000000000000000000000000108610003000000ef0300000000000009000000
5+0000000000000000000000006e6574207469746c650000001c00610001005000
6+f303000000000000000000000000000000000000000000000108620003000000
7+ef03000000000000090000000000000000000000000000006e6574207469746c
8+650000001c00620001005000f303000000000000000000000000000000000000
9+000000000108630003000000ef03000000000000090000000000000000000000
10+000000006e6574207469746c650000001c00630001005000f303000000000000
11+000000000000000000000000000000000108640003000000ef03000000000000
12+090000000000000000000000000000006e6574207469746c650000001c006400
13+01005000f3030000000000000000000000000000000000000000000001086500
14+03000000ef03000000000000090000000000000000000000000000006e657420
15+7469746c650000001c00650001005000f3030000000000000000000000000000
16+00000000000000000108660003000000ef030000000000000900000000000000
17+00000000000000006e6574207469746c650000001c00660001005000f3030000
18+00000000000000000000000000000000000000000108670003000000ef030000
19+00000000090000000000000000000000000000006e6574207469746c65000000
20+1c00670001005000f30300000000000000000000000000000000000000000000
21+0108680003000000ef0300000000000009000000000000000000000000000000
22+6e6574207469746c650000001c00680001005000f30300000000000000000000
23+0000000000000000000000000108690003000000ef0300000000000009000000
24+0000000000000000000000006e6574207469746c650000001c00690001005000
25+f3030000000000000000000000000000000000000000000001086a0003000000
26+ef03000000000000090000000000000000000000000000006e6574207469746c
27+650000001c006a0001005000f303000000000000000000000000000000000000
28+0000000001086b0003000000ef03000000000000090000000000000000000000
29+000000006e6574207469746c650000001c006b0001005000f303000000000000
30+0000000000000000000000000000000001086c0003000000ef03000000000000
31+090000000000000000000000000000006e6574207469746c650000001c006c00
32+01005000f3030000000000000000000000000000000000000000000001086d00
33+03000000ef03000000000000090000000000000000000000000000006e657420
34+7469746c650000001c006d0001005000f3030000000000000000000000000000
35+000000000000000001086e0003000000ef030000000000000900000000000000
36+00000000000000006e6574207469746c650000001c006e0001005000f3030000
37+000000000000000000000000000000000000000001086f0003000000ef030000
38+00000000090000000000000000000000000000006e6574207469746c65000000
39+1c006f0001005000f30300000000000000000000000000000000000000000000
40+0108700003000000ef0300000000000009000000000000000000000000000000
41+6e6574207469746c650000001c00700001005000f30300000000000000000000
42+0000000000000000000000000108710003000000ef0300000000000009000000
43+0000000000000000000000006e6574207469746c650000001c00710001005000
44+f303000000000000000000000000000000000000000000000108720003000000
45+ef03000000000000090000000000000000000000000000006e6574207469746c
46+650000001c00720001005000f303000000000000000000000000000000000000
47+000000000108730003000000ef03000000000000090000000000000000000000
48+000000006e6574207469746c650000001c00730001005000f303000000000000
49+000000000000000000000000000000000108740003000000ef03000000000000
50+090000000000000000000000000000006e6574207469746c650000001c007400
51+01005000f3030000000000000000000000000000000000000000000001087500
52+03000000ef03000000000000090000000000000000000000000000006e657420
53+7469746c650000001c00750001005000f3030000000000000000000000000000
54+00000000000000000108760003000000ef030000000000000900000000000000
55+00000000000000006e6574207469746c650000001c00760001005000f3030000
56+00000000000000000000000000000000000000000108770003000000ef030000
57+00000000090000000000000000000000000000006e6574207469746c65000000
58+1c00770001005000f30300000000000000000000000000000000000000000000
59+0108780003000000ef0300000000000009000000000000000000000000000000
60+6e6574207469746c650000001c00780001005000f30300000000000000000000
61+0000000000000000000000000108790003000000ef0300000000000009000000
62+0000000000000000000000006e6574207469746c650000001c00790001005000
63+f3030000000000000000000000000000000000000000000001087a0003000000
64+ef03000000000000090000000000000000000000000000006e6574207469746c
65+650000001c007a0001005000f303000000000000000000000000000000000000
66+0000000001087b0003000000ef03000000000000090000000000000000000000
67+000000006e6574207469746c650000001c007b0001005000f303000000000000
68+0000000000000000000000000000000001087c0003000000ef03000000000000
69+090000000000000000000000000000006e6574207469746c650000001c007c00
70+01005000f3030000000000000000000000000000000000000000000001087d00
71+03000000ef03000000000000090000000000000000000000000000006e657420
72+7469746c650000001c007d0001005000f3030000000000000000000000000000
73+000000000000000001087e0003000000ef030000000000000900000000000000
74+00000000000000006e6574207469746c650000001c007e0001005000f3030000
75+000000000000000000000000000000000000000001087f0003000000ef030000
76+00000000090000000000000000000000000000006e6574207469746c65000000
77+1c007f0001005000f30300000000000000000000000000000000000000000000
78+0108800003000000ef0300000000000009000000000000000000000000000000
79+6e6574207469746c650000001c00800001005000f30300000000000000000000
80+0000000000000000000000000108810003000000ef0300000000000009000000
81+0000000000000000000000006e6574207469746c650000001c00810001005000
82+f303000000000000000000000000000000000000000000000108820003000000
83+ef03000000000000090000000000000000000000000000006e6574207469746c
84+650000001c00820001005000f303000000000000000000000000000000000000
85+000000000108830003000000ef03000000000000090000000000000000000000
86+000000006e6574207469746c650000001c00830001005000f303000000000000
87+000000000000000000000000000000000108840003000000ef03000000000000
88+090000000000000000000000000000006e6574207469746c650000001c008400
89+01005000f3030000000000000000000000000000000000000000000001088500
90+03000000ef03000000000000090000000000000000000000000000006e657420
91+7469746c650000001c00850001005000f3030000000000000000000000000000
92+00000000000000000108860003000000ef030000000000000900000000000000
93+00000000000000006e6574207469746c650000001c00860001005000f3030000
94+00000000000000000000000000000000000000000108870003000000ef030000
95+00000000090000000000000000000000000000006e6574207469746c65000000
96+1c00870001005000f30300000000000000000000000000000000000000000000
97+0108880003000000ef0300000000000009000000000000000000000000000000
98+6e6574207469746c650000001c00880001005000f30300000000000000000000
99+0000000000000000000000000108890003000000ef0300000000000009000000
100+0000000000000000000000006e6574207469746c650000001c00890001005000
101+f3030000000000000000000000000000000000000000000001088a0003000000
102+ef03000000000000090000000000000000000000000000006e6574207469746c
103+650000001c008a0001005000f303000000000000000000000000000000000000
104+0000000001088b0003000000ef03000000000000090000000000000000000000
105+000000006e6574207469746c650000001c008b0001005000f303000000000000
106+0000000000000000000000000000000001088c0003000000ef03000000000000
107+090000000000000000000000000000006e6574207469746c650000001c008c00
108+01005000f3030000000000000000000000000000000000000000000001088d00
109+03000000ef03000000000000090000000000000000000000000000006e657420
110+7469746c650000001c008d0001005000f3030000000000000000000000000000
111+000000000000000001088e0003000000ef030000000000000900000000000000
112+00000000000000006e6574207469746c650000001c008e0001005000f3030000
113+000000000000000000000000000000000000000001088f0003000000ef030000
114+00000000090000000000000000000000000000006e6574207469746c65000000
115+1c008f0001005000f30300000000000000000000000000000000000000000000
116+0108900003000000ef0300000000000009000000000000000000000000000000
117+6e6574207469746c650000001c00900001005000f30300000000000000000000
118+0000000000000000000000000108910003000000ef0300000000000009000000
119+0000000000000000000000006e6574207469746c650000001c00910001005000
120+f303000000000000000000000000000000000000000000000108920003000000
121+ef03000000000000090000000000000000000000000000006e6574207469746c
122+650000001c00920001005000f303000000000000000000000000000000000000
123+000000000108930003000000ef03000000000000090000000000000000000000
124+000000006e6574207469746c650000001c00930001005000f303000000000000
125+000000000000000000000000000000000108940003000000ef03000000000000
126+090000000000000000000000000000006e6574207469746c650000001c009400
127+01005000f3030000000000000000000000000000000000000000000001089500
128+03000000ef03000000000000090000000000000000000000000000006e657420
129+7469746c650000001c00950001005000f3030000000000000000000000000000
130+00000000000000000108960003000000ef030000000000000900000000000000
131+00000000000000006e6574207469746c650000001c00960001005000f3030000
132+00000000000000000000000000000000000000000108970003000000ef030000
133+00000000090000000000000000000000000000006e6574207469746c65000000
134+1c00970001005000f30300000000000000000000000000000000000000000000
135+0108980003000000ef0300000000000009000000000000000000000000000000
136+6e6574207469746c650000001c00980001005000f30300000000000000000000
137+0000000000000000000000000108990003000000ef0300000000000009000000
138+0000000000000000000000006e6574207469746c650000001c00990001005000
139+f3030000000000000000000000000000000000000000000001089a0003000000
140+ef03000000000000090000000000000000000000000000006e6574207469746c
141+650000001c009a0001005000f303000000000000000000000000000000000000
142+0000000001089b0003000000ef03000000000000090000000000000000000000
143+000000006e6574207469746c650000001c009b0001005000f303000000000000
144+0000000000000000000000000000000001089c0003000000ef03000000000000
145+090000000000000000000000000000006e6574207469746c650000001c009c00
146+01005000f3030000000000000000000000000000000000000000000001089d00
147+03000000ef03000000000000090000000000000000000000000000006e657420
148+7469746c650000001c009d0001005000f3030000000000000000000000000000
149+000000000000000001089e0003000000ef030000000000000900000000000000
150+00000000000000006e6574207469746c650000001c009e0001005000f3030000
151+000000000000000000000000000000000000000001089f0003000000ef030000
152+00000000090000000000000000000000000000006e6574207469746c65000000
153+1c009f0001005000f30300000000000000000000000000000000000000000000
154+0108a00003000000ef0300000000000009000000000000000000000000000000
155+6e6574207469746c650000001c00a00001005000f30300000000000000000000
156+0000000000000000000000000108a10003000000ef0300000000000009000000
157+0000000000000000000000006e6574207469746c650000001c00a10001005000
158+f303000000000000000000000000000000000000000000000108a20003000000
159+ef03000000000000090000000000000000000000000000006e6574207469746c
160+650000001c00a20001005000f303000000000000000000000000000000000000
161+000000000108a30003000000ef03000000000000090000000000000000000000
162+000000006e6574207469746c650000001c00a30001005000f303000000000000
163+000000000000000000000000000000000108a40003000000ef03000000000000
164+090000000000000000000000000000006e6574207469746c650000001c00a400
165+01005000f303000000000000000000000000000000000000000000000108a500
166+03000000ef03000000000000090000000000000000000000000000006e657420
167+7469746c650000001c00a50001005000f3030000000000000000000000000000
168+00000000000000000108a60003000000ef030000000000000900000000000000
169+00000000000000006e6574207469746c650000001c00a60001005000f3030000
170+00000000000000000000000000000000000000000108a70003000000ef030000
171+00000000090000000000000000000000000000006e6574207469746c65000000
172+1c00a70001005000f30300000000000000000000000000000000000000000000
173+0108a80003000000ef0300000000000009000000000000000000000000000000
174+6e6574207469746c650000001c00a80001005000f30300000000000000000000
175+0000000000000000000000000108a90003000000ef0300000000000009000000
176+0000000000000000000000006e6574207469746c650000001c00a90001005000
177+f303000000000000000000000000000000000000000000000108aa0003000000
178+ef03000000000000090000000000000000000000000000006e6574207469746c
179+650000001c00aa0001005000f303000000000000000000000000000000000000
180+000000000108ab0003000000ef03000000000000090000000000000000000000
181+000000006e6574207469746c650000001c00ab0001005000f303000000000000
182+000000000000000000000000000000000108ac0003000000ef03000000000000
183+090000000000000000000000000000006e6574207469746c650000001c00ac00
184+01005000f303000000000000000000000000000000000000000000000108ad00
185+03000000ef03000000000000090000000000000000000000000000006e657420
186+7469746c650000001c00ad0001005000f3030000000000000000000000000000
187+00000000000000000108ae0003000000ef030000000000000900000000000000
188+00000000000000006e6574207469746c650000001c00ae0001005000f3030000
189+00000000000000000000000000000000000000000108af0003000000ef030000
190+00000000090000000000000000000000000000006e6574207469746c65000000
191+1c00af0001005000f30300000000000000000000000000000000000000000000
192+0108b00003000000ef0300000000000009000000000000000000000000000000
193+6e6574207469746c650000001c00b00001005000f30300000000000000000000
194+0000000000000000000000000108b10003000000ef0300000000000009000000
195+0000000000000000000000006e6574207469746c650000001c00b10001005000
196+f303000000000000000000000000000000000000000000000108b20003000000
197+ef03000000000000090000000000000000000000000000006e6574207469746c
198+650000001c00b20001005000f303000000000000000000000000000000000000
199+000000000108b30003000000ef03000000000000090000000000000000000000
200+000000006e6574207469746c650000001c00b30001005000f303000000000000
201+000000000000000000000000000000000108b40003000000ef03000000000000
202+090000000000000000000000000000006e6574207469746c650000001c00b400
203+01005000f303000000000000000000000000000000000000000000000108b500
204+03000000ef03000000000000090000000000000000000000000000006e657420
205+7469746c650000001c00b50001005000f3030000000000000000000000000000
206+00000000000000000108b60003000000ef030000000000000900000000000000
207+00000000000000006e6574207469746c650000001c00b60001005000f3030000
208+00000000000000000000000000000000000000000108b70003000000ef030000
209+00000000090000000000000000000000000000006e6574207469746c65000000
210+1c00b70001005000f30300000000000000000000000000000000000000000000
211+0108b80003000000ef0300000000000009000000000000000000000000000000
212+6e6574207469746c650000001c00b80001005000f30300000000000000000000
213+0000000000000000000000000108b90003000000ef0300000000000009000000
214+0000000000000000000000006e6574207469746c650000001c00b90001005000
215+f303000000000000000000000000000000000000000000000108ba0003000000
216+ef03000000000000090000000000000000000000000000006e6574207469746c
217+650000001c00ba0001005000f303000000000000000000000000000000000000
218+000000000108bb0003000000ef03000000000000090000000000000000000000
219+000000006e6574207469746c650000001c00bb0001005000f303000000000000
220+000000000000000000000000000000000108bc0003000000ef03000000000000
221+090000000000000000000000000000006e6574207469746c650000001c00bc00
222+01005000f303000000000000000000000000000000000000000000000108bd00
223+03000000ef03000000000000090000000000000000000000000000006e657420
224+7469746c650000001c00bd0001005000f3030000000000000000000000000000
225+00000000000000000108be0003000000ef030000000000000900000000000000
226+00000000000000006e6574207469746c650000001c00be0001005000f3030000
227+00000000000000000000000000000000000000000108bf0003000000ef030000
228+00000000090000000000000000000000000000006e6574207469746c65000000
229+1c00bf0001005000f30300000000000000000000000000000000000000000000
230+0108c00003000000ef0300000000000009000000000000000000000000000000
231+6e6574207469746c650000001c00c00001005000f30300000000000000000000
232+0000000000000000000000000108c10003000000ef0300000000000009000000
233+0000000000000000000000006e6574207469746c650000001c00c10001005000
234+f303000000000000000000000000000000000000000000000108c20003000000
235+ef03000000000000090000000000000000000000000000006e6574207469746c
236+650000001c00c20001005000f303000000000000000000000000000000000000
237+000000000108c30003000000ef03000000000000090000000000000000000000
238+000000006e6574207469746c650000001c00c30001005000f303000000000000
239+000000000000000000000000000000000108c40003000000ef03000000000000
240+090000000000000000000000000000006e6574207469746c650000001c00c400
241+01005000f303000000000000000000000000000000000000000000000108c500
242+03000000ef03000000000000090000000000000000000000000000006e657420
243+7469746c650000001c00c50001005000f3030000000000000000000000000000
244+00000000000000000108c60003000000ef030000000000000900000000000000
245+00000000000000006e6574207469746c650000001c00c60001005000f3030000
246+00000000000000000000000000000000000000000108c70003000000ef030000
247+00000000090000000000000000000000000000006e6574207469746c65000000
248+1c00c70001005000f30300000000000000000000000000000000000000000000
249+0108c80003000000ef0300000000000009000000000000000000000000000000
250+6e6574207469746c650000001c00c80001005000f30300000000000000000000
251+0000000000000000000000000108c90003000000ef0300000000000009000000
252+0000000000000000000000006e6574207469746c650000001c00c90001005000
253+f303000000000000000000000000000000000000000000000108ca0003000000
254+ef03000000000000090000000000000000000000000000006e6574207469746c
255+650000001c00ca0001005000f303000000000000000000000000000000000000
256+000000000108cb0003000000ef03000000000000090000000000000000000000
257+000000006e6574207469746c650000001c00cb0001005000f303000000000000
258+000000000000000000000000000000000108cc0003000000ef03000000000000
259+090000000000000000000000000000006e6574207469746c650000001c00cc00
260+01005000f303000000000000000000000000000000000000000000000108cd00
261+03000000ef03000000000000090000000000000000000000000000006e657420
262+7469746c650000001c00cd0001005000f3030000000000000000000000000000
263+00000000000000000108ce0003000000ef030000000000000900000000000000
264+00000000000000006e6574207469746c650000001c00ce0001005000f3030000
265+00000000000000000000000000000000000000000108cf0003000000ef030000
266+00000000090000000000000000000000000000006e6574207469746c65000000
267+1c00cf0001005000f30300000000000000000000000000000000000000000000
268+0108d00003000000ef0300000000000009000000000000000000000000000000
269+6e6574207469746c650000001c00d00001005000f30300000000000000000000
270+0000000000000000000000000108d10003000000ef0300000000000009000000
271+0000000000000000000000006e6574207469746c650000001c00d10001005000
272+f303000000000000000000000000000000000000000000000108d20003000000
273+ef03000000000000090000000000000000000000000000006e6574207469746c
274+650000001c00d20001005000f303000000000000000000000000000000000000
275+000000000108d30003000000ef03000000000000090000000000000000000000
276+000000006e6574207469746c650000001c00d30001005000f303000000000000
277+000000000000000000000000000000000108d40003000000ef03000000000000
278+090000000000000000000000000000006e6574207469746c650000001c00d400
279+01005000f303000000000000000000000000000000000000000000000108d500
280+03000000ef03000000000000090000000000000000000000000000006e657420
281+7469746c650000001c00d50001005000f3030000000000000000000000000000
282+00000000000000000108d60003000000ef030000000000000900000000000000
283+00000000000000006e6574207469746c650000001c00d60001005000f3030000
284+00000000000000000000000000000000000000000108d70003000000ef030000
285+00000000090000000000000000000000000000006e6574207469746c65000000
286+1c00d70001005000f30300000000000000000000000000000000000000000000
287+0108d80003000000ef0300000000000009000000000000000000000000000000
288+6e6574207469746c650000001c00d80001005000f30300000000000000000000
289+0000000000000000000000000108d90003000000ef0300000000000009000000
290+0000000000000000000000006e6574207469746c650000001c00d90001005000
291+f303000000000000000000000000000000000000000000000108da0003000000
292+ef03000000000000090000000000000000000000000000006e6574207469746c
293+650000001c00da0001005000f303000000000000000000000000000000000000
294+000000000108db0003000000ef03000000000000090000000000000000000000
295+000000006e6574207469746c650000001c00db0001005000f303000000000000
296+000000000000000000000000000000000108dc0003000000ef03000000000000
297+090000000000000000000000000000006e6574207469746c650000001c00dc00
298+01005000f303000000000000000000000000000000000000000000000108dd00
299+03000000ef03000000000000090000000000000000000000000000006e657420
300+7469746c650000001c00dd0001005000f3030000000000000000000000000000
301+00000000000000000108de0003000000ef030000000000000900000000000000
302+00000000000000006e6574207469746c650000001c00de0001005000f3030000
303+00000000000000000000000000000000000000000108df0003000000ef030000
304+00000000090000000000000000000000000000006e6574207469746c65000000
305+1c00df0001005000f30300000000000000000000000000000000000000000000
306+0108e00003000000ef0300000000000009000000000000000000000000000000
307+6e6574207469746c650000001c00e00001005000f30300000000000000000000
308+0000000000000000000000000108e10003000000ef0300000000000009000000
309+0000000000000000000000006e6574207469746c650000001c00e10001005000
310+f303000000000000000000000000000000000000000000000108e20003000000
311+ef03000000000000090000000000000000000000000000006e6574207469746c
312+650000001c00e20001005000f303000000000000000000000000000000000000
313+000000000108e30003000000ef03000000000000090000000000000000000000
314+000000006e6574207469746c650000001c00e30001005000f303000000000000
315+000000000000000000000000000000000108e40003000000ef03000000000000
316+090000000000000000000000000000006e6574207469746c650000001c00e400
317+01005000f303000000000000000000000000000000000000000000000108e500
318+03000000ef03000000000000090000000000000000000000000000006e657420
319+7469746c650000001c00e50001005000f3030000000000000000000000000000
320+00000000000000000108e60003000000ef030000000000000900000000000000
321+00000000000000006e6574207469746c650000001c00e60001005000f3030000
322+00000000000000000000000000000000000000000108e70003000000ef030000
323+00000000090000000000000000000000000000006e6574207469746c65000000
324+1c00e70001005000f30300000000000000000000000000000000000000000000
325+0108e80003000000ef0300000000000009000000000000000000000000000000
326+6e6574207469746c650000001c00e80001005000f30300000000000000000000
327+0000000000000000000000000108e90003000000ef0300000000000009000000
328+0000000000000000000000006e6574207469746c650000001c00e90001005000
329+f303000000000000000000000000000000000000000000000108ea0003000000
330+ef03000000000000090000000000000000000000000000006e6574207469746c
331+650000001c00ea0001005000f303000000000000000000000000000000000000
332+000000000108eb0003000000ef03000000000000090000000000000000000000
333+000000006e6574207469746c650000001c00eb0001005000f303000000000000
334+000000000000000000000000000000000108ec0003000000ef03000000000000
335+090000000000000000000000000000006e6574207469746c650000001c00ec00
336+01005000f303000000000000000000000000000000000000000000000108ed00
337+03000000ef03000000000000090000000000000000000000000000006e657420
338+7469746c650000001c00ed0001005000f3030000000000000000000000000000
339+00000000000000000108ee0003000000ef030000000000000900000000000000
340+00000000000000006e6574207469746c650000001c00ee0001005000f3030000
341+00000000000000000000000000000000000000000108ef0003000000ef030000
342+00000000090000000000000000000000000000006e6574207469746c65000000
343+1c00ef0001005000f30300000000000000000000000000000000000000000000
344+0108f00003000000ef0300000000000009000000000000000000000000000000
345+6e6574207469746c650000001c00f00001005000f30300000000000000000000
346+0000000000000000000000000108f10003000000ef0300000000000009000000
347+0000000000000000000000006e6574207469746c650000001c00f10001005000
348+f303000000000000000000000000000000000000000000000108f20003000000
349+ef03000000000000090000000000000000000000000000006e6574207469746c
350+650000001c00f20001005000f303000000000000000000000000000000000000
351+000000000108f30003000000ef03000000000000090000000000000000000000
352+000000006e6574207469746c650000001c00f30001005000f303000000000000
353+000000000000000000000000000000000108f40003000000ef03000000000000
354+090000000000000000000000000000006e6574207469746c650000001c00f400
355+01005000f303000000000000000000000000000000000000000000000108f500
356+03000000ef03000000000000090000000000000000000000000000006e657420
357+7469746c650000001c00f50001005000f3030000000000000000000000000000
358+00000000000000000108f60003000000ef030000000000000900000000000000
359+00000000000000006e6574207469746c650000001c00f60001005000f3030000
360+00000000000000000000000000000000000000000108f70003000000ef030000
361+00000000090000000000000000000000000000006e6574207469746c65000000
362+1c00f70001005000f30300000000000000000000000000000000000000000000
363+0108f80003000000ef0300000000000009000000000000000000000000000000
364+6e6574207469746c650000001c00f80001005000f30300000000000000000000
365+0000000000000000000000000108f90003000000ef0300000000000009000000
366+0000000000000000000000006e6574207469746c650000001c00f90001005000
367+f303000000000000000000000000000000000000000000000108fa0003000000
368+ef03000000000000090000000000000000000000000000006e6574207469746c
369+650000001c00fa0001005000f303000000000000000000000000000000000000
370+000000000108fb0003000000ef03000000000000090000000000000000000000
371+000000006e6574207469746c650000001c00fb0001005000f303000000000000
372+000000000000000000000000000000000108fc0003000000ef03000000000000
373+090000000000000000000000000000006e6574207469746c650000001c00fc00
374+01005000f303000000000000000000000000000000000000000000000108fd00
375+03000000ef03000000000000090000000000000000000000000000006e657420
376+7469746c650000001c00fd0001005000f3030000000000000000000000000000
377+00000000000000000108fe0003000000ef030000000000000900000000000000
378+00000000000000006e6574207469746c650000001c00fe0001005000f3030000
379+00000000000000000000000000000000000000000108ff0003000000ef030000
380+00000000090000000000000000000000000000006e6574207469746c65000000
381+1c00ff0001005000f30300000000000000000000000000000000000000000000
382+0108000103000000ef0300000000000009000000000000000000000000000000
383+6e6574207469746c650000001c00000101005000f30300000000000000000000
384+0000000000000000000000000108010103000000ef0300000000000009000000
385+0000000000000000000000006e6574207469746c650000001c00010101005000
386+f303000000000000000000000000000000000000000000000108020103000000
387+ef03000000000000090000000000000000000000000000006e6574207469746c
388+650000001c00020101005000f303000000000000000000000000000000000000
389+000000000108030103000000ef03000000000000090000000000000000000000
390+000000006e6574207469746c650000001c00030101005000f303000000000000
391+000000000000000000000000000000000108040103000000ef03000000000000
392+090000000000000000000000000000006e6574207469746c650000001c000401
393+01005000f3030000000000000000000000000000000000000000000001080501
394+03000000ef03000000000000090000000000000000000000000000006e657420
395+7469746c650000001c00050101005000f3030000000000000000000000000000
396+00000000000000000108060103000000ef030000000000000900000000000000
397+00000000000000006e6574207469746c650000001c00060101005000f3030000
398+00000000000000000000000000000000000000000108070103000000ef030000
399+00000000090000000000000000000000000000006e6574207469746c65000000
400+1c00070101005000f30300000000000000000000000000000000000000000000
401+0108080103000000ef0300000000000009000000000000000000000000000000
402+6e6574207469746c650000001c00080101005000f30300000000000000000000
403+0000000000000000000000000108090103000000ef0300000000000009000000
404+0000000000000000000000006e6574207469746c650000001c00090101005000
405+f3030000000000000000000000000000000000000000000001080a0103000000
406+ef03000000000000090000000000000000000000000000006e6574207469746c
407+650000001c000a0101005000f303000000000000000000000000000000000000
408+0000000001080b0103000000ef03000000000000090000000000000000000000
409+000000006e6574207469746c650000001c000b0101005000f303000000000000
410+0000000000000000000000000000000001080c0103000000ef03000000000000
411+090000000000000000000000000000006e6574207469746c650000001c000c01
412+01005000f3030000000000000000000000000000000000000000000001080d01
413+03000000ef03000000000000090000000000000000000000000000006e657420
414+7469746c650000001c000d0101005000f3030000000000000000000000000000
415+000000000000000001080e0103000000ef030000000000000900000000000000
416+00000000000000006e6574207469746c650000001c000e0101005000f3030000
417+000000000000000000000000000000000000000001080f0103000000ef030000
418+00000000090000000000000000000000000000006e6574207469746c65000000
419+1c000f0101005000f30300000000000000000000000000000000000000000000
420+0108100103000000ef0300000000000009000000000000000000000000000000
421+6e6574207469746c650000001c00100101005000f30300000000000000000000
422+0000000000000000000000000108110103000000ef0300000000000009000000
423+0000000000000000000000006e6574207469746c650000001c00110101005000
424+f303000000000000000000000000000000000000000000000108120103000000
425+ef03000000000000090000000000000000000000000000006e6574207469746c
426+650000001c00120101005000f303000000000000000000000000000000000000
427+000000000108130103000000ef03000000000000090000000000000000000000
428+000000006e6574207469746c650000001c00130101005000f303000000000000
429+000000000000000000000000000000000108140103000000ef03000000000000
430+090000000000000000000000000000006e6574207469746c650000001c001401
431+01005000f3030000000000000000000000000000000000000000000001081501
432+03000000ef03000000000000090000000000000000000000000000006e657420
433+7469746c650000001c00150101005000f3030000000000000000000000000000
434+00000000000000000108160103000000ef030000000000000900000000000000
435+00000000000000006e6574207469746c650000001c00160101005000f3030000
436+00000000000000000000000000000000000000000108170103000000ef030000
437+00000000090000000000000000000000000000006e6574207469746c65000000
438+1c00170101005000f30300000000000000000000000000000000000000000000
439+0108180103000000ef0300000000000009000000000000000000000000000000
440+6e6574207469746c650000001c00180101005000f30300000000000000000000
441+0000000000000000000000000108190103000000ef0300000000000009000000
442+0000000000000000000000006e6574207469746c650000001c00190101005000
443+f3030000000000000000000000000000000000000000000001081a0103000000
444+ef03000000000000090000000000000000000000000000006e6574207469746c
445+650000001c001a0101005000f303000000000000000000000000000000000000
446+0000000001081b0103000000ef03000000000000090000000000000000000000
447+000000006e6574207469746c650000001c001b0101005000f303000000000000
448+0000000000000000000000000000000001081c0103000000ef03000000000000
449+090000000000000000000000000000006e6574207469746c650000001c001c01
450+01005000f3030000000000000000000000000000000000000000000001081d01
451+03000000ef03000000000000090000000000000000000000000000006e657420
452+7469746c650000001c001d0101005000f3030000000000000000000000000000
453+000000000000000001081e0103000000ef030000000000000900000000000000
454+00000000000000006e6574207469746c650000001c001e0101005000f3030000
455+000000000000000000000000000000000000000001081f0103000000ef030000
456+00000000090000000000000000000000000000006e6574207469746c65000000
457+1c001f0101005000f30300000000000000000000000000000000000000000000
458+0108200103000000ef0300000000000009000000000000000000000000000000
459+6e6574207469746c650000001c00200101005000f30300000000000000000000
460+0000000000000000000000000108210103000000ef0300000000000009000000
461+0000000000000000000000006e6574207469746c650000001c00210101005000
462+f303000000000000000000000000000000000000000000000108220103000000
463+ef03000000000000090000000000000000000000000000006e6574207469746c
464+650000001c00220101005000f303000000000000000000000000000000000000
465+000000000108230103000000ef03000000000000090000000000000000000000
466+000000006e6574207469746c650000001c00230101005000f303000000000000
467+000000000000000000000000000000000108240103000000ef03000000000000
468+090000000000000000000000000000006e6574207469746c650000001c002401
469+01005000f3030000000000000000000000000000000000000000000001082501
470+03000000ef03000000000000090000000000000000000000000000006e657420
471+7469746c650000001c00250101005000f3030000000000000000000000000000
472+00000000000000000108260103000000ef030000000000000900000000000000
473+00000000000000006e6574207469746c650000001c00260101005000f3030000
474+00000000000000000000000000000000000000000108270103000000ef030000
475+00000000090000000000000000000000000000006e6574207469746c65000000
476+1c00270101005000f30300000000000000000000000000000000000000000000
477+0108280103000000ef0300000000000009000000000000000000000000000000
478+6e6574207469746c650000001c00280101005000f30300000000000000000000
479+0000000000000000000000000108290103000000ef0300000000000009000000
480+0000000000000000000000006e6574207469746c650000001c00290101005000
481+f3030000000000000000000000000000000000000000000001082a0103000000
482+ef03000000000000090000000000000000000000000000006e6574207469746c
483+650000001c002a0101005000f303000000000000000000000000000000000000
484+0000000001082b0103000000ef03000000000000090000000000000000000000
485+000000006e6574207469746c650000001c002b0101005000f303000000000000
486+0000000000000000000000000000000001082c0103000000ef03000000000000
487+090000000000000000000000000000006e6574207469746c650000001c002c01
488+01005000f3030000000000000000000000000000000000000000000001082d01
489+03000000ef03000000000000090000000000000000000000000000006e657420
490+7469746c650000001c002d0101005000f3030000000000000000000000000000
491+000000000000000001082e0103000000ef030000000000000900000000000000
492+00000000000000006e6574207469746c650000001c002e0101005000f3030000
493+000000000000000000000000000000000000000001082f0103000000ef030000
494+00000000090000000000000000000000000000006e6574207469746c65000000
495+1c002f0101005000f30300000000000000000000000000000000000000000000
496+0108300103000000ef0300000000000009000000000000000000000000000000
497+6e6574207469746c650000001c00300101005000f30300000000000000000000
498+0000000000000000000000000108310103000000ef0300000000000009000000
499+0000000000000000000000006e6574207469746c650000001c00310101005000
500+f303000000000000000000000000000000000000000000000108320103000000
501+ef03000000000000090000000000000000000000000000006e6574207469746c
502+650000001c00320101005000f303000000000000000000000000000000000000
503+000000000108330103000000ef03000000000000090000000000000000000000
504+000000006e6574207469746c650000001c00330101005000f303000000000000
505+000000000000000000000000000000000108340103000000ef03000000000000
506+090000000000000000000000000000006e6574207469746c650000001c003401
507+01005000f3030000000000000000000000000000000000000000000001083501
508+03000000ef03000000000000090000000000000000000000000000006e657420
509+7469746c650000001c00350101005000f3030000000000000000000000000000
510+00000000000000000108360103000000ef030000000000000900000000000000
511+00000000000000006e6574207469746c650000001c00360101005000f3030000
512+00000000000000000000000000000000000000000108370103000000ef030000
513+00000000090000000000000000000000000000006e6574207469746c65000000
514+1c00370101005000f30300000000000000000000000000000000000000000000
515+0108380103000000ef0300000000000009000000000000000000000000000000
516+6e6574207469746c650000001c00380101005000f30300000000000000000000
517+0000000000000000000000000108390103000000ef0300000000000009000000
518+0000000000000000000000006e6574207469746c650000001c00390101005000
519+f3030000000000000000000000000000000000000000000001083a0103000000
520+ef03000000000000090000000000000000000000000000006e6574207469746c
521+650000001c003a0101005000f303000000000000000000000000000000000000
522+0000000001083b0103000000ef03000000000000090000000000000000000000
523+000000006e6574207469746c650000001c003b0101005000f303000000000000
524+0000000000000000000000000000000001083c0103000000ef03000000000000
525+090000000000000000000000000000006e6574207469746c650000001c003c01
526+01005000f3030000000000000000000000000000000000000000000001083d01
527+03000000ef03000000000000090000000000000000000000000000006e657420
528+7469746c650000001c003d0101005000f3030000000000000000000000000000
529+000000000000000001083e0103000000ef030000000000000900000000000000
530+00000000000000006e6574207469746c650000001c003e0101005000f3030000
531+000000000000000000000000000000000000000001083f0103000000ef030000
532+00000000090000000000000000000000000000006e6574207469746c65000000
533+1c003f0101005000f30300000000000000000000000000000000000000000000
534+0108400103000000ef0300000000000009000000000000000000000000000000
535+6e6574207469746c650000001c00400101005000f30300000000000000000000
536+0000000000000000000000000108410103000000ef0300000000000009000000
537+0000000000000000000000006e6574207469746c650000001c00410101005000
538+f303000000000000000000000000000000000000000000000108420103000000
539+ef03000000000000090000000000000000000000000000006e6574207469746c
540+650000001c00420101005000f303000000000000000000000000000000000000
541+000000000108430103000000ef03000000000000090000000000000000000000
542+000000006e6574207469746c650000001c00430101005000f303000000000000
543+000000000000000000000000000000000108440103000000ef03000000000000
544+090000000000000000000000000000006e6574207469746c650000001c004401
545+01005000f3030000000000000000000000000000000000000000000001084501
546+03000000ef03000000000000090000000000000000000000000000006e657420
547+7469746c650000001c00450101005000f3030000000000000000000000000000
548+00000000000000000108460103000000ef030000000000000900000000000000
549+00000000000000006e6574207469746c650000001c00460101005000f3030000
550+00000000000000000000000000000000000000000108470103000000ef030000
551+00000000090000000000000000000000000000006e6574207469746c65000000
552+1c00470101005000f30300000000000000000000000000000000000000000000
553+0108480103000000ef0300000000000009000000000000000000000000000000
554+6e6574207469746c650000001c00480101005000f30300000000000000000000
555+0000000000000000000000000108490103000000ef0300000000000009000000
556+0000000000000000000000006e6574207469746c650000001c00490101005000
557+f3030000000000000000000000000000000000000000000001084a0103000000
558+ef03000000000000090000000000000000000000000000006e6574207469746c
559+650000001c004a0101005000f303000000000000000000000000000000000000
560+0000000001084b0103000000ef03000000000000090000000000000000000000
561+000000006e6574207469746c650000001c004b0101005000f303000000000000
562+0000000000000000000000000000000001084c0103000000ef03000000000000
563+090000000000000000000000000000006e6574207469746c650000001c004c01
564+01005000f3030000000000000000000000000000000000000000000001084d01
565+03000000ef03000000000000090000000000000000000000000000006e657420
566+7469746c650000001c004d0101005000f3030000000000000000000000000000
567+000000000000000001084e0103000000ef030000000000000900000000000000
568+00000000000000006e6574207469746c650000001c004e0101005000f3030000
569+000000000000000000000000000000000000000001084f0103000000ef030000
570+00000000090000000000000000000000000000006e6574207469746c65000000
571+1c004f0101005000f30300000000000000000000000000000000000000000000
572+0108500103000000ef0300000000000009000000000000000000000000000000
573+6e6574207469746c650000001c00500101005000f30300000000000000000000
574+0000000000000000000000000108510103000000ef0300000000000009000000
575+0000000000000000000000006e6574207469746c650000001c00510101005000
576+f303000000000000000000000000000000000000000000000108520103000000
577+ef03000000000000090000000000000000000000000000006e6574207469746c
578+650000001c00520101005000f303000000000000000000000000000000000000
579+000000000108530103000000ef03000000000000090000000000000000000000
580+000000006e6574207469746c650000001c00530101005000f303000000000000
581+000000000000000000000000000000000108540103000000ef03000000000000
582+090000000000000000000000000000006e6574207469746c650000001c005401
583+01005000f3030000000000000000000000000000000000000000000001085501
584+03000000ef03000000000000090000000000000000000000000000006e657420
585+7469746c650000001c00550101005000f3030000000000000000000000000000
586+00000000000000000108560103000000ef030000000000000900000000000000
587+00000000000000006e6574207469746c650000001c00560101005000f3030000
588+00000000000000000000000000000000000000000108570103000000ef030000
589+00000000090000000000000000000000000000006e6574207469746c65000000
590+1c00570101005000f30300000000000000000000000000000000000000000000
591+0108580103000000ef0300000000000009000000000000000000000000000000
592+6e6574207469746c650000001c00580101005000f30300000000000000000000
593+0000000000000000000000000108590103000000ef0300000000000009000000
594+0000000000000000000000006e6574207469746c650000001c00590101005000
595+f3030000000000000000000000000000000000000000000001085a0103000000
596+ef03000000000000090000000000000000000000000000006e6574207469746c
597+650000001c005a0101005000f303000000000000000000000000000000000000
598+0000000001085b0103000000ef03000000000000090000000000000000000000
599+000000006e6574207469746c650000001c005b0101005000f303000000000000
600+0000000000000000000000000000000001085c0103000000ef03000000000000
601+090000000000000000000000000000006e6574207469746c650000001c005c01
602+01005000f3030000000000000000000000000000000000000000000001085d01
603+03000000ef03000000000000090000000000000000000000000000006e657420
604+7469746c650000001c005d0101005000f3030000000000000000000000000000
605+000000000000000001085e0103000000ef030000000000000900000000000000
606+00000000000000006e6574207469746c650000001c005e0101005000f3030000
607+000000000000000000000000000000000000000001085f0103000000ef030000
608+00000000090000000000000000000000000000006e6574207469746c65000000
609+1c005f0101005000f30300000000000000000000000000000000000000000000
610+0108600103000000ef0300000000000009000000000000000000000000000000
611+6e6574207469746c650000001c00600101005000f30300000000000000000000
612+0000000000000000000000000108610103000000ef0300000000000009000000
613+0000000000000000000000006e6574207469746c650000001c00610101005000
614+f303000000000000000000000000000000000000000000000108620103000000
615+ef03000000000000090000000000000000000000000000006e6574207469746c
616+650000001c00620101005000f303000000000000000000000000000000000000
617+000000000108630103000000ef03000000000000090000000000000000000000
618+000000006e6574207469746c650000001c00630101005000f303000000000000
619+000000000000000000000000000000000108640103000000ef03000000000000
620+090000000000000000000000000000006e6574207469746c650000001c006401
621+01005000f3030000000000000000000000000000000000000000000001086501
622+03000000ef03000000000000090000000000000000000000000000006e657420
623+7469746c650000001c00650101005000f3030000000000000000000000000000
624+00000000000000000108660103000000ef030000000000000900000000000000
625+00000000000000006e6574207469746c650000001c00660101005000f3030000
626+00000000000000000000000000000000000000000108670103000000ef030000
627+00000000090000000000000000000000000000006e6574207469746c65000000
628+1c00670101005000f30300000000000000000000000000000000000000000000
629+0108680103000000ef0300000000000009000000000000000000000000000000
630+6e6574207469746c650000001c00680101005000f30300000000000000000000
631+0000000000000000000000000108690103000000ef0300000000000009000000
632+0000000000000000000000006e6574207469746c650000001c00690101005000
633+f3030000000000000000000000000000000000000000000001086a0103000000
634+ef03000000000000090000000000000000000000000000006e6574207469746c
635+650000001c006a0101005000f303000000000000000000000000000000000000
636+0000000001086b0103000000ef03000000000000090000000000000000000000
637+000000006e6574207469746c650000001c006b0101005000f303000000000000
638+0000000000000000000000000000000001086c0103000000ef03000000000000
639+090000000000000000000000000000006e6574207469746c650000001c006c01
640+01005000f3030000000000000000000000000000000000000000000001086d01
641+03000000ef03000000000000090000000000000000000000000000006e657420
642+7469746c650000001c006d0101005000f3030000000000000000000000000000
643+000000000000000001086e0103000000ef030000000000000900000000000000
644+00000000000000006e6574207469746c650000001c006e0101005000f3030000
645+000000000000000000000000000000000000000001086f0103000000ef030000
646+00000000090000000000000000000000000000006e6574207469746c65000000
647+1c006f0101005000f30300000000000000000000000000000000000000000000
648+0108700103000000ef0300000000000009000000000000000000000000000000
649+6e6574207469746c650000001c00700101005000f30300000000000000000000
650+0000000000000000000000000108710103000000ef0300000000000009000000
651+0000000000000000000000006e6574207469746c650000001c00710101005000
652+f303000000000000000000000000000000000000000000000108720103000000
653+ef03000000000000090000000000000000000000000000006e6574207469746c
654+650000001c00720101005000f303000000000000000000000000000000000000
655+000000000108730103000000ef03000000000000090000000000000000000000
656+000000006e6574207469746c650000001c00730101005000f303000000000000
657+000000000000000000000000000000000108740103000000ef03000000000000
658+090000000000000000000000000000006e6574207469746c650000001c007401
659+01005000f3030000000000000000000000000000000000000000000001087501
660+03000000ef03000000000000090000000000000000000000000000006e657420
661+7469746c650000001c00750101005000f3030000000000000000000000000000
662+00000000000000000108760103000000ef030000000000000900000000000000
663+00000000000000006e6574207469746c650000001c00760101005000f3030000
664+00000000000000000000000000000000000000000108770103000000ef030000
665+00000000090000000000000000000000000000006e6574207469746c65000000
666+1c00770101005000f30300000000000000000000000000000000000000000000
667+0108780103000000ef0300000000000009000000000000000000000000000000
668+6e6574207469746c650000001c00780101005000f30300000000000000000000
669+0000000000000000000000000108790103000000ef0300000000000009000000
670+0000000000000000000000006e6574207469746c650000001c00790101005000
671+f3030000000000000000000000000000000000000000000001087a0103000000
672+ef03000000000000090000000000000000000000000000006e6574207469746c
673+650000001c007a0101005000f303000000000000000000000000000000000000
674+0000000001087b0103000000ef03000000000000090000000000000000000000
675+000000006e6574207469746c650000001c007b0101005000f303000000000000
676+0000000000000000000000000000000001087c0103000000ef03000000000000
677+090000000000000000000000000000006e6574207469746c650000001c007c01
678+01005000f3030000000000000000000000000000000000000000000001087d01
679+03000000ef03000000000000090000000000000000000000000000006e657420
680+7469746c650000001c007d0101005000f3030000000000000000000000000000
681+000000000000000001087e0103000000ef030000000000000900000000000000
682+00000000000000006e6574207469746c650000001c007e0101005000f3030000
683+000000000000000000000000000000000000000001087f0103000000ef030000
684+00000000090000000000000000000000000000006e6574207469746c65000000
685+1c007f0101005000f30300000000000000000000000000000000000000000000
686+0108800103000000ef0300000000000009000000000000000000000000000000
687+6e6574207469746c650000001c00800101005000f30300000000000000000000
688+0000000000000000000000000108810103000000ef0300000000000009000000
689+0000000000000000000000006e6574207469746c650000001c00810101005000
690+f303000000000000000000000000000000000000000000000108820103000000
691+ef03000000000000090000000000000000000000000000006e6574207469746c
692+650000001c00820101005000f303000000000000000000000000000000000000
693+000000000108830103000000ef03000000000000090000000000000000000000
694+000000006e6574207469746c650000001c00830101005000f303000000000000
695+000000000000000000000000000000000108840103000000ef03000000000000
696+090000000000000000000000000000006e6574207469746c650000001c008401
697+01005000f3030000000000000000000000000000000000000000000001088501
698+03000000ef03000000000000090000000000000000000000000000006e657420
699+7469746c650000001c00850101005000f3030000000000000000000000000000
700+00000000000000000108860103000000ef030000000000000900000000000000
701+00000000000000006e6574207469746c650000001c00860101005000f3030000
702+00000000000000000000000000000000000000000108870103000000ef030000
703+00000000090000000000000000000000000000006e6574207469746c65000000
704+1c00870101005000f30300000000000000000000000000000000000000000000
705+0108880103000000ef0300000000000009000000000000000000000000000000
706+6e6574207469746c650000001c00880101005000f30300000000000000000000
707+0000000000000000000000000108890103000000ef0300000000000009000000
708+0000000000000000000000006e6574207469746c650000001c00890101005000
709+f3030000000000000000000000000000000000000000000001088a0103000000
710+ef03000000000000090000000000000000000000000000006e6574207469746c
711+650000001c008a0101005000f303000000000000000000000000000000000000
712+0000000001088b0103000000ef03000000000000090000000000000000000000
713+000000006e6574207469746c650000001c008b0101005000f303000000000000
714+0000000000000000000000000000000001088c0103000000ef03000000000000
715+090000000000000000000000000000006e6574207469746c650000001c008c01
716+01005000f3030000000000000000000000000000000000000000000001088d01
717+03000000ef03000000000000090000000000000000000000000000006e657420
718+7469746c650000001c008d0101005000f3030000000000000000000000000000
719+000000000000000001088e0103000000ef030000000000000900000000000000
720+00000000000000006e6574207469746c650000001c008e0101005000f3030000
721+000000000000000000000000000000000000000001088f0103000000ef030000
722+00000000090000000000000000000000000000006e6574207469746c65000000
723+1c008f0101005000f30300000000000000000000000000000000000000000000
724+0108900103000000ef0300000000000009000000000000000000000000000000
725+6e6574207469746c650000001c00900101005000f30300000000000000000000
726+0000000000000000000000000108910103000000ef0300000000000009000000
727+0000000000000000000000006e6574207469746c650000001c00910101005000
728+f303000000000000000000000000000000000000000000000108920103000000
729+ef03000000000000090000000000000000000000000000006e6574207469746c
730+650000001c00920101005000f303000000000000000000000000000000000000
731+000000000108930103000000ef03000000000000090000000000000000000000
732+000000006e6574207469746c650000001c00930101005000f303000000000000
733+000000000000000000000000000000000108940103000000ef03000000000000
734+090000000000000000000000000000006e6574207469746c650000001c009401
735+01005000f3030000000000000000000000000000000000000000000001089501
736+03000000ef03000000000000090000000000000000000000000000006e657420
737+7469746c650000001c00950101005000f3030000000000000000000000000000
738+00000000000000000108960103000000ef030000000000000900000000000000
739+00000000000000006e6574207469746c650000001c00960101005000f3030000
740+00000000000000000000000000000000000000000108970103000000ef030000
741+00000000090000000000000000000000000000006e6574207469746c65000000
742+1c00970101005000f30300000000000000000000000000000000000000000000
743+0108980103000000ef0300000000000009000000000000000000000000000000
744+6e6574207469746c650000001c00980101005000f30300000000000000000000
745+0000000000000000000000000108990103000000ef0300000000000009000000
746+0000000000000000000000006e6574207469746c650000001c00990101005000
747+f3030000000000000000000000000000000000000000000001089a0103000000
748+ef03000000000000090000000000000000000000000000006e6574207469746c
749+650000001c009a0101005000f303000000000000000000000000000000000000
750+0000000001089b0103000000ef03000000000000090000000000000000000000
751+000000006e6574207469746c650000001c009b0101005000f303000000000000
752+0000000000000000000000000000000001089c0103000000ef03000000000000
753+090000000000000000000000000000006e6574207469746c650000001c009c01
754+01005000f3030000000000000000000000000000000000000000000001089d01
755+03000000ef03000000000000090000000000000000000000000000006e657420
756+7469746c650000001c009d0101005000f3030000000000000000000000000000
757+000000000000000001089e0103000000ef030000000000000900000000000000
758+00000000000000006e6574207469746c650000001c009e0101005000f3030000
759+000000000000000000000000000000000000000001089f0103000000ef030000
760+00000000090000000000000000000000000000006e6574207469746c65000000
761+1c009f0101005000f30300000000000000000000000000000000000000000000
762+0108a00103000000ef0300000000000009000000000000000000000000000000
763+6e6574207469746c650000001c00a00101005000f30300000000000000000000
764+0000000000000000000000000108a10103000000ef0300000000000009000000
765+0000000000000000000000006e6574207469746c650000001c00a10101005000
766+f303000000000000000000000000000000000000000000000108a20103000000
767+ef03000000000000090000000000000000000000000000006e6574207469746c
768+650000001c00a20101005000f303000000000000000000000000000000000000
769+000000000108a30103000000ef03000000000000090000000000000000000000
770+000000006e6574207469746c650000001c00a30101005000f303000000000000
771+000000000000000000000000000000000108a40103000000ef03000000000000
772+090000000000000000000000000000006e6574207469746c650000001c00a401
773+01005000f303000000000000000000000000000000000000000000000108a501
774+03000000ef03000000000000090000000000000000000000000000006e657420
775+7469746c650000001c00a50101005000f3030000000000000000000000000000
776+00000000000000000108a60103000000ef030000000000000900000000000000
777+00000000000000006e6574207469746c650000001c00a60101005000f3030000
778+00000000000000000000000000000000000000000108a70103000000ef030000
779+00000000090000000000000000000000000000006e6574207469746c65000000
780+1c00a70101005000f30300000000000000000000000000000000000000000000
781+0108a80103000000ef0300000000000009000000000000000000000000000000
782+6e6574207469746c650000001c00a80101005000f30300000000000000000000
783+0000000000000000000000000108a90103000000ef0300000000000009000000
784+0000000000000000000000006e6574207469746c650000001c00a90101005000
785+f303000000000000000000000000000000000000000000000108aa0103000000
786+ef03000000000000090000000000000000000000000000006e6574207469746c
787+650000001c00aa0101005000f303000000000000000000000000000000000000
788+000000000108ab0103000000ef03000000000000090000000000000000000000
789+000000006e6574207469746c650000001c00ab0101005000f303000000000000
790+000000000000000000000000000000000108ac0103000000ef03000000000000
791+090000000000000000000000000000006e6574207469746c650000001c00ac01
792+01005000f303000000000000000000000000000000000000000000000108ad01
793+03000000ef03000000000000090000000000000000000000000000006e657420
794+7469746c650000001c00ad0101005000f3030000000000000000000000000000
795+00000000000000000108ae0103000000ef030000000000000900000000000000
796+00000000000000006e6574207469746c650000001c00ae0101005000f3030000
797+00000000000000000000000000000000000000000108af0103000000ef030000
798+00000000090000000000000000000000000000006e6574207469746c65000000
799+1c00af0101005000f30300000000000000000000000000000000000000000000
800+0108b00103000000ef0300000000000009000000000000000000000000000000
801+6e6574207469746c650000001c00b00101005000f30300000000000000000000
802+0000000000000000000000000108b10103000000ef0300000000000009000000
803+0000000000000000000000006e6574207469746c650000001c00b10101005000
804+f303000000000000000000000000000000000000000000000108b20103000000
805+ef03000000000000090000000000000000000000000000006e6574207469746c
806+650000001c00b20101005000f303000000000000000000000000000000000000
807+000000000108b30103000000ef03000000000000090000000000000000000000
808+000000006e6574207469746c650000001c00b30101005000f303000000000000
809+000000000000000000000000000000000108b40103000000ef03000000000000
810+090000000000000000000000000000006e6574207469746c650000001c00b401
811+01005000f303000000000000000000000000000000000000000000000108b501
812+03000000ef03000000000000090000000000000000000000000000006e657420
813+7469746c650000001c00b50101005000f3030000000000000000000000000000
814+00000000000000000108b60103000000ef030000000000000900000000000000
815+00000000000000006e6574207469746c650000001c00b60101005000f3030000
816+00000000000000000000000000000000000000000108b70103000000ef030000
817+00000000090000000000000000000000000000006e6574207469746c65000000
818+1c00b70101005000f30300000000000000000000000000000000000000000000
819+0108b80103000000ef0300000000000009000000000000000000000000000000
820+6e6574207469746c650000001c00b80101005000f30300000000000000000000
821+0000000000000000000000000108b90103000000ef0300000000000009000000
822+0000000000000000000000006e6574207469746c650000001c00b90101005000
823+f303000000000000000000000000000000000000000000000108ba0103000000
824+ef03000000000000090000000000000000000000000000006e6574207469746c
825+650000001c00ba0101005000f303000000000000000000000000000000000000
826+000000000108bb0103000000ef03000000000000090000000000000000000000
827+000000006e6574207469746c650000001c00bb0101005000f303000000000000
828+000000000000000000000000000000000108bc0103000000ef03000000000000
829+090000000000000000000000000000006e6574207469746c650000001c00bc01
830+01005000f303000000000000000000000000000000000000000000000108bd01
831+03000000ef03000000000000090000000000000000000000000000006e657420
832+7469746c650000001c00bd0101005000f3030000000000000000000000000000
833+00000000000000000108be0103000000ef030000000000000900000000000000
834+00000000000000006e6574207469746c650000001c00be0101005000f3030000
835+00000000000000000000000000000000000000000108bf0103000000ef030000
836+00000000090000000000000000000000000000006e6574207469746c65000000
837+1c00bf0101005000f30300000000000000000000000000000000000000000000
838+0108c00103000000ef0300000000000009000000000000000000000000000000
839+6e6574207469746c650000001c00c00101005000f30300000000000000000000
840+0000000000000000000000000108c10103000000ef0300000000000009000000
841+0000000000000000000000006e6574207469746c650000001c00c10101005000
842+f303000000000000000000000000000000000000000000000108c20103000000
843+ef03000000000000090000000000000000000000000000006e6574207469746c
844+650000001c00c20101005000f303000000000000000000000000000000000000
845+000000000108c30103000000ef03000000000000090000000000000000000000
846+000000006e6574207469746c650000001c00c30101005000f303000000000000
847+000000000000000000000000000000000108c40103000000ef03000000000000
848+090000000000000000000000000000006e6574207469746c650000001c00c401
849+01005000f303000000000000000000000000000000000000000000000108c501
850+03000000ef03000000000000090000000000000000000000000000006e657420
851+7469746c650000001c00c50101005000f3030000000000000000000000000000
852+00000000000000000108c60103000000ef030000000000000900000000000000
853+00000000000000006e6574207469746c650000001c00c60101005000f3030000
854+00000000000000000000000000000000000000000108c70103000000ef030000
855+00000000090000000000000000000000000000006e6574207469746c65000000
856+1c00c70101005000f30300000000000000000000000000000000000000000000
857+0108c80103000000ef0300000000000009000000000000000000000000000000
858+6e6574207469746c650000001c00c80101005000f30300000000000000000000
859+0000000000000000000000000108c90103000000ef0300000000000009000000
860+0000000000000000000000006e6574207469746c650000001c00c90101005000
861+f303000000000000000000000000000000000000000000000108ca0103000000
862+ef03000000000000090000000000000000000000000000006e6574207469746c
863+650000001c00ca0101005000f303000000000000000000000000000000000000
864+000000000108cb0103000000ef03000000000000090000000000000000000000
865+000000006e6574207469746c650000001c00cb0101005000f303000000000000
866+000000000000000000000000000000000108cc0103000000ef03000000000000
867+090000000000000000000000000000006e6574207469746c650000001c00cc01
868+01005000f303000000000000000000000000000000000000000000000108cd01
869+03000000ef03000000000000090000000000000000000000000000006e657420
870+7469746c650000001c00cd0101005000f3030000000000000000000000000000
871+00000000000000000108ce0103000000ef030000000000000900000000000000
872+00000000000000006e6574207469746c650000001c00ce0101005000f3030000
873+00000000000000000000000000000000000000000108cf0103000000ef030000
874+00000000090000000000000000000000000000006e6574207469746c65000000
875+1c00cf0101005000f30300000000000000000000000000000000000000000000
876+0108d00103000000ef0300000000000009000000000000000000000000000000
877+6e6574207469746c650000001c00d00101005000f30300000000000000000000
878+0000000000000000000000000108d10103000000ef0300000000000009000000
879+0000000000000000000000006e6574207469746c650000001c00d10101005000
880+f303000000000000000000000000000000000000000000000108d20103000000
881+ef03000000000000090000000000000000000000000000006e6574207469746c
882+650000001c00d20101005000f303000000000000000000000000000000000000
883+000000000108d30103000000ef03000000000000090000000000000000000000
884+000000006e6574207469746c650000001c00d30101005000f303000000000000
885+000000000000000000000000000000000108d40103000000ef03000000000000
886+090000000000000000000000000000006e6574207469746c650000001c00d401
887+01005000f303000000000000000000000000000000000000000000000108d501
888+03000000ef03000000000000090000000000000000000000000000006e657420
889+7469746c650000001c00d50101005000f3030000000000000000000000000000
890+00000000000000000108d60103000000ef030000000000000900000000000000
891+00000000000000006e6574207469746c650000001c00d60101005000f3030000
892+00000000000000000000000000000000000000000108d70103000000ef030000
893+00000000090000000000000000000000000000006e6574207469746c65000000
894+1c00d70101005000f30300000000000000000000000000000000000000000000
895+0108d80103000000ef0300000000000009000000000000000000000000000000
896+6e6574207469746c650000001c00d80101005000f30300000000000000000000
897+0000000000000000000000000108d90103000000ef0300000000000009000000
898+0000000000000000000000006e6574207469746c650000001c00d90101005000
899+f303000000000000000000000000000000000000000000000108da0103000000
900+ef03000000000000090000000000000000000000000000006e6574207469746c
901+650000001c00da0101005000f303000000000000000000000000000000000000
902+000000000108db0103000000ef03000000000000090000000000000000000000
903+000000006e6574207469746c650000001c00db0101005000f303000000000000
904+000000000000000000000000000000000108dc0103000000ef03000000000000
905+090000000000000000000000000000006e6574207469746c650000001c00dc01
906+01005000f303000000000000000000000000000000000000000000000108dd01
907+03000000ef03000000000000090000000000000000000000000000006e657420
908+7469746c650000001c00dd0101005000f3030000000000000000000000000000
909+00000000000000000108de0103000000ef030000000000000900000000000000
910+00000000000000006e6574207469746c650000001c00de0101005000f3030000
911+00000000000000000000000000000000000000000108df0103000000ef030000
912+00000000090000000000000000000000000000006e6574207469746c65000000
913+1c00df0101005000f30300000000000000000000000000000000000000000000
914+0108e00103000000ef0300000000000009000000000000000000000000000000
915+6e6574207469746c650000001c00e00101005000f30300000000000000000000
916+0000000000000000000000000108e10103000000ef0300000000000009000000
917+0000000000000000000000006e6574207469746c650000001c00e10101005000
918+f303000000000000000000000000000000000000000000000108e20103000000
919+ef03000000000000090000000000000000000000000000006e6574207469746c
920+650000001c00e20101005000f303000000000000000000000000000000000000
921+000000000108e30103000000ef03000000000000090000000000000000000000
922+000000006e6574207469746c650000001c00e30101005000f303000000000000
923+000000000000000000000000000000000108e40103000000ef03000000000000
924+090000000000000000000000000000006e6574207469746c650000001c00e401
925+01005000f303000000000000000000000000000000000000000000000108e501
926+03000000ef03000000000000090000000000000000000000000000006e657420
927+7469746c650000001c00e50101005000f3030000000000000000000000000000
928+00000000000000000108e60103000000ef030000000000000900000000000000
929+00000000000000006e6574207469746c650000001c00e60101005000f3030000
930+00000000000000000000000000000000000000000108e70103000000ef030000
931+00000000090000000000000000000000000000006e6574207469746c65000000
932+1c00e70101005000f30300000000000000000000000000000000000000000000
933+0108e80103000000ef0300000000000009000000000000000000000000000000
934+6e6574207469746c650000001c00e80101005000f30300000000000000000000
935+0000000000000000000000000108e90103000000ef0300000000000009000000
936+0000000000000000000000006e6574207469746c650000001c00e90101005000
937+f303000000000000000000000000000000000000000000000108ea0103000000
938+ef03000000000000090000000000000000000000000000006e6574207469746c
939+650000001c00ea0101005000f303000000000000000000000000000000000000
940+000000000108eb0103000000ef03000000000000090000000000000000000000
941+000000006e6574207469746c650000001c00eb0101005000f303000000000000
942+000000000000000000000000000000000108ec0103000000ef03000000000000
943+090000000000000000000000000000006e6574207469746c650000001c00ec01
944+01005000f303000000000000000000000000000000000000000000000108ed01
945+03000000ef03000000000000090000000000000000000000000000006e657420
946+7469746c650000001c00ed0101005000f3030000000000000000000000000000
947+00000000000000000108ee0103000000ef030000000000000900000000000000
948+00000000000000006e6574207469746c650000001c00ee0101005000f3030000
949+00000000000000000000000000000000000000000108ef0103000000ef030000
950+00000000090000000000000000000000000000006e6574207469746c65000000
A internal/adapters/wayland/xwm/testdata/streams/steady.hex +2150 -0
@@ -0,0 +1,2150 @@
1+1c005f0001005000f30300000000000000000000000000000000000000000000
2+0108600003000000ef0300000000000009000000000000000000000000000000
3+6e6574207469746c650000001600600001005000010050000000000000000000
4+0a0014002c01c800000000000900600001005000000000000000000000000000
5+0000000000000000000000001300600000010000010050000000000000000000
6+0000000000000000000000001c00600001005000f30300000000000000000000
7+0000000000000000000000000108610003000000ef0300000000000009000000
8+0000000000000000000000006e6574207469746c650000001600610001005000
9+0100500000000000000000000a0014002c01c800000000000900610001005000
10+0000000000000000000000000000000000000000000000001300610000010000
11+0100500000000000000000000000000000000000000000001c00610001005000
12+f303000000000000000000000000000000000000000000000108620003000000
13+ef03000000000000090000000000000000000000000000006e6574207469746c
14+6500000016006200010050000100500000000000000000000a0014002c01c800
15+0000000009006200010050000000000000000000000000000000000000000000
16+0000000013006200000100000100500000000000000000000000000000000000
17+000000001c00620001005000f303000000000000000000000000000000000000
18+000000000108630003000000ef03000000000000090000000000000000000000
19+000000006e6574207469746c6500000016006300010050000100500000000000
20+000000000a0014002c01c8000000000009006300010050000000000000000000
21+0000000000000000000000000000000013006300000100000100500000000000
22+000000000000000000000000000000001c00630001005000f303000000000000
23+000000000000000000000000000000000108640003000000ef03000000000000
24+090000000000000000000000000000006e6574207469746c6500000016006400
25+010050000100500000000000000000000a0014002c01c8000000000009006400
26+0100500000000000000000000000000000000000000000000000000013006400
27+000100000100500000000000000000000000000000000000000000001c006400
28+01005000f3030000000000000000000000000000000000000000000001086500
29+03000000ef03000000000000090000000000000000000000000000006e657420
30+7469746c6500000016006500010050000100500000000000000000000a001400
31+2c01c80000000000090065000100500000000000000000000000000000000000
32+0000000000000000130065000001000001005000000000000000000000000000
33+00000000000000001c00650001005000f3030000000000000000000000000000
34+00000000000000000108660003000000ef030000000000000900000000000000
35+00000000000000006e6574207469746c65000000160066000100500001005000
36+00000000000000000a0014002c01c80000000000090066000100500000000000
37+0000000000000000000000000000000000000000130066000001000001005000
38+00000000000000000000000000000000000000001c00660001005000f3030000
39+00000000000000000000000000000000000000000108670003000000ef030000
40+00000000090000000000000000000000000000006e6574207469746c65000000
41+16006700010050000100500000000000000000000a0014002c01c80000000000
42+0900670001005000000000000000000000000000000000000000000000000000
43+1300670000010000010050000000000000000000000000000000000000000000
44+1c00670001005000f30300000000000000000000000000000000000000000000
45+0108680003000000ef0300000000000009000000000000000000000000000000
46+6e6574207469746c650000001600680001005000010050000000000000000000
47+0a0014002c01c800000000000900680001005000000000000000000000000000
48+0000000000000000000000001300680000010000010050000000000000000000
49+0000000000000000000000001c00680001005000f30300000000000000000000
50+0000000000000000000000000108690003000000ef0300000000000009000000
51+0000000000000000000000006e6574207469746c650000001600690001005000
52+0100500000000000000000000a0014002c01c800000000000900690001005000
53+0000000000000000000000000000000000000000000000001300690000010000
54+0100500000000000000000000000000000000000000000001c00690001005000
55+f3030000000000000000000000000000000000000000000001086a0003000000
56+ef03000000000000090000000000000000000000000000006e6574207469746c
57+6500000016006a00010050000100500000000000000000000a0014002c01c800
58+0000000009006a00010050000000000000000000000000000000000000000000
59+0000000013006a00000100000100500000000000000000000000000000000000
60+000000001c006a0001005000f303000000000000000000000000000000000000
61+0000000001086b0003000000ef03000000000000090000000000000000000000
62+000000006e6574207469746c6500000016006b00010050000100500000000000
63+000000000a0014002c01c8000000000009006b00010050000000000000000000
64+0000000000000000000000000000000013006b00000100000100500000000000
65+000000000000000000000000000000001c006b0001005000f303000000000000
66+0000000000000000000000000000000001086c0003000000ef03000000000000
67+090000000000000000000000000000006e6574207469746c6500000016006c00
68+010050000100500000000000000000000a0014002c01c8000000000009006c00
69+0100500000000000000000000000000000000000000000000000000013006c00
70+000100000100500000000000000000000000000000000000000000001c006c00
71+01005000f3030000000000000000000000000000000000000000000001086d00
72+03000000ef03000000000000090000000000000000000000000000006e657420
73+7469746c6500000016006d00010050000100500000000000000000000a001400
74+2c01c8000000000009006d000100500000000000000000000000000000000000
75+000000000000000013006d000001000001005000000000000000000000000000
76+00000000000000001c006d0001005000f3030000000000000000000000000000
77+000000000000000001086e0003000000ef030000000000000900000000000000
78+00000000000000006e6574207469746c6500000016006e000100500001005000
79+00000000000000000a0014002c01c8000000000009006e000100500000000000
80+000000000000000000000000000000000000000013006e000001000001005000
81+00000000000000000000000000000000000000001c006e0001005000f3030000
82+000000000000000000000000000000000000000001086f0003000000ef030000
83+00000000090000000000000000000000000000006e6574207469746c65000000
84+16006f00010050000100500000000000000000000a0014002c01c80000000000
85+09006f0001005000000000000000000000000000000000000000000000000000
86+13006f0000010000010050000000000000000000000000000000000000000000
87+1c006f0001005000f30300000000000000000000000000000000000000000000
88+0108700003000000ef0300000000000009000000000000000000000000000000
89+6e6574207469746c650000001600700001005000010050000000000000000000
90+0a0014002c01c800000000000900700001005000000000000000000000000000
91+0000000000000000000000001300700000010000010050000000000000000000
92+0000000000000000000000001c00700001005000f30300000000000000000000
93+0000000000000000000000000108710003000000ef0300000000000009000000
94+0000000000000000000000006e6574207469746c650000001600710001005000
95+0100500000000000000000000a0014002c01c800000000000900710001005000
96+0000000000000000000000000000000000000000000000001300710000010000
97+0100500000000000000000000000000000000000000000001c00710001005000
98+f303000000000000000000000000000000000000000000000108720003000000
99+ef03000000000000090000000000000000000000000000006e6574207469746c
100+6500000016007200010050000100500000000000000000000a0014002c01c800
101+0000000009007200010050000000000000000000000000000000000000000000
102+0000000013007200000100000100500000000000000000000000000000000000
103+000000001c00720001005000f303000000000000000000000000000000000000
104+000000000108730003000000ef03000000000000090000000000000000000000
105+000000006e6574207469746c6500000016007300010050000100500000000000
106+000000000a0014002c01c8000000000009007300010050000000000000000000
107+0000000000000000000000000000000013007300000100000100500000000000
108+000000000000000000000000000000001c00730001005000f303000000000000
109+000000000000000000000000000000000108740003000000ef03000000000000
110+090000000000000000000000000000006e6574207469746c6500000016007400
111+010050000100500000000000000000000a0014002c01c8000000000009007400
112+0100500000000000000000000000000000000000000000000000000013007400
113+000100000100500000000000000000000000000000000000000000001c007400
114+01005000f3030000000000000000000000000000000000000000000001087500
115+03000000ef03000000000000090000000000000000000000000000006e657420
116+7469746c6500000016007500010050000100500000000000000000000a001400
117+2c01c80000000000090075000100500000000000000000000000000000000000
118+0000000000000000130075000001000001005000000000000000000000000000
119+00000000000000001c00750001005000f3030000000000000000000000000000
120+00000000000000000108760003000000ef030000000000000900000000000000
121+00000000000000006e6574207469746c65000000160076000100500001005000
122+00000000000000000a0014002c01c80000000000090076000100500000000000
123+0000000000000000000000000000000000000000130076000001000001005000
124+00000000000000000000000000000000000000001c00760001005000f3030000
125+00000000000000000000000000000000000000000108770003000000ef030000
126+00000000090000000000000000000000000000006e6574207469746c65000000
127+16007700010050000100500000000000000000000a0014002c01c80000000000
128+0900770001005000000000000000000000000000000000000000000000000000
129+1300770000010000010050000000000000000000000000000000000000000000
130+1c00770001005000f30300000000000000000000000000000000000000000000
131+0108780003000000ef0300000000000009000000000000000000000000000000
132+6e6574207469746c650000001600780001005000010050000000000000000000
133+0a0014002c01c800000000000900780001005000000000000000000000000000
134+0000000000000000000000001300780000010000010050000000000000000000
135+0000000000000000000000001c00780001005000f30300000000000000000000
136+0000000000000000000000000108790003000000ef0300000000000009000000
137+0000000000000000000000006e6574207469746c650000001600790001005000
138+0100500000000000000000000a0014002c01c800000000000900790001005000
139+0000000000000000000000000000000000000000000000001300790000010000
140+0100500000000000000000000000000000000000000000001c00790001005000
141+f3030000000000000000000000000000000000000000000001087a0003000000
142+ef03000000000000090000000000000000000000000000006e6574207469746c
143+6500000016007a00010050000100500000000000000000000a0014002c01c800
144+0000000009007a00010050000000000000000000000000000000000000000000
145+0000000013007a00000100000100500000000000000000000000000000000000
146+000000001c007a0001005000f303000000000000000000000000000000000000
147+0000000001087b0003000000ef03000000000000090000000000000000000000
148+000000006e6574207469746c6500000016007b00010050000100500000000000
149+000000000a0014002c01c8000000000009007b00010050000000000000000000
150+0000000000000000000000000000000013007b00000100000100500000000000
151+000000000000000000000000000000001c007b0001005000f303000000000000
152+0000000000000000000000000000000001087c0003000000ef03000000000000
153+090000000000000000000000000000006e6574207469746c6500000016007c00
154+010050000100500000000000000000000a0014002c01c8000000000009007c00
155+0100500000000000000000000000000000000000000000000000000013007c00
156+000100000100500000000000000000000000000000000000000000001c007c00
157+01005000f3030000000000000000000000000000000000000000000001087d00
158+03000000ef03000000000000090000000000000000000000000000006e657420
159+7469746c6500000016007d00010050000100500000000000000000000a001400
160+2c01c8000000000009007d000100500000000000000000000000000000000000
161+000000000000000013007d000001000001005000000000000000000000000000
162+00000000000000001c007d0001005000f3030000000000000000000000000000
163+000000000000000001087e0003000000ef030000000000000900000000000000
164+00000000000000006e6574207469746c6500000016007e000100500001005000
165+00000000000000000a0014002c01c8000000000009007e000100500000000000
166+000000000000000000000000000000000000000013007e000001000001005000
167+00000000000000000000000000000000000000001c007e0001005000f3030000
168+000000000000000000000000000000000000000001087f0003000000ef030000
169+00000000090000000000000000000000000000006e6574207469746c65000000
170+16007f00010050000100500000000000000000000a0014002c01c80000000000
171+09007f0001005000000000000000000000000000000000000000000000000000
172+13007f0000010000010050000000000000000000000000000000000000000000
173+1c007f0001005000f30300000000000000000000000000000000000000000000
174+0108800003000000ef0300000000000009000000000000000000000000000000
175+6e6574207469746c650000001600800001005000010050000000000000000000
176+0a0014002c01c800000000000900800001005000000000000000000000000000
177+0000000000000000000000001300800000010000010050000000000000000000
178+0000000000000000000000001c00800001005000f30300000000000000000000
179+0000000000000000000000000108810003000000ef0300000000000009000000
180+0000000000000000000000006e6574207469746c650000001600810001005000
181+0100500000000000000000000a0014002c01c800000000000900810001005000
182+0000000000000000000000000000000000000000000000001300810000010000
183+0100500000000000000000000000000000000000000000001c00810001005000
184+f303000000000000000000000000000000000000000000000108820003000000
185+ef03000000000000090000000000000000000000000000006e6574207469746c
186+6500000016008200010050000100500000000000000000000a0014002c01c800
187+0000000009008200010050000000000000000000000000000000000000000000
188+0000000013008200000100000100500000000000000000000000000000000000
189+000000001c00820001005000f303000000000000000000000000000000000000
190+000000000108830003000000ef03000000000000090000000000000000000000
191+000000006e6574207469746c6500000016008300010050000100500000000000
192+000000000a0014002c01c8000000000009008300010050000000000000000000
193+0000000000000000000000000000000013008300000100000100500000000000
194+000000000000000000000000000000001c00830001005000f303000000000000
195+000000000000000000000000000000000108840003000000ef03000000000000
196+090000000000000000000000000000006e6574207469746c6500000016008400
197+010050000100500000000000000000000a0014002c01c8000000000009008400
198+0100500000000000000000000000000000000000000000000000000013008400
199+000100000100500000000000000000000000000000000000000000001c008400
200+01005000f3030000000000000000000000000000000000000000000001088500
201+03000000ef03000000000000090000000000000000000000000000006e657420
202+7469746c6500000016008500010050000100500000000000000000000a001400
203+2c01c80000000000090085000100500000000000000000000000000000000000
204+0000000000000000130085000001000001005000000000000000000000000000
205+00000000000000001c00850001005000f3030000000000000000000000000000
206+00000000000000000108860003000000ef030000000000000900000000000000
207+00000000000000006e6574207469746c65000000160086000100500001005000
208+00000000000000000a0014002c01c80000000000090086000100500000000000
209+0000000000000000000000000000000000000000130086000001000001005000
210+00000000000000000000000000000000000000001c00860001005000f3030000
211+00000000000000000000000000000000000000000108870003000000ef030000
212+00000000090000000000000000000000000000006e6574207469746c65000000
213+16008700010050000100500000000000000000000a0014002c01c80000000000
214+0900870001005000000000000000000000000000000000000000000000000000
215+1300870000010000010050000000000000000000000000000000000000000000
216+1c00870001005000f30300000000000000000000000000000000000000000000
217+0108880003000000ef0300000000000009000000000000000000000000000000
218+6e6574207469746c650000001600880001005000010050000000000000000000
219+0a0014002c01c800000000000900880001005000000000000000000000000000
220+0000000000000000000000001300880000010000010050000000000000000000
221+0000000000000000000000001c00880001005000f30300000000000000000000
222+0000000000000000000000000108890003000000ef0300000000000009000000
223+0000000000000000000000006e6574207469746c650000001600890001005000
224+0100500000000000000000000a0014002c01c800000000000900890001005000
225+0000000000000000000000000000000000000000000000001300890000010000
226+0100500000000000000000000000000000000000000000001c00890001005000
227+f3030000000000000000000000000000000000000000000001088a0003000000
228+ef03000000000000090000000000000000000000000000006e6574207469746c
229+6500000016008a00010050000100500000000000000000000a0014002c01c800
230+0000000009008a00010050000000000000000000000000000000000000000000
231+0000000013008a00000100000100500000000000000000000000000000000000
232+000000001c008a0001005000f303000000000000000000000000000000000000
233+0000000001088b0003000000ef03000000000000090000000000000000000000
234+000000006e6574207469746c6500000016008b00010050000100500000000000
235+000000000a0014002c01c8000000000009008b00010050000000000000000000
236+0000000000000000000000000000000013008b00000100000100500000000000
237+000000000000000000000000000000001c008b0001005000f303000000000000
238+0000000000000000000000000000000001088c0003000000ef03000000000000
239+090000000000000000000000000000006e6574207469746c6500000016008c00
240+010050000100500000000000000000000a0014002c01c8000000000009008c00
241+0100500000000000000000000000000000000000000000000000000013008c00
242+000100000100500000000000000000000000000000000000000000001c008c00
243+01005000f3030000000000000000000000000000000000000000000001088d00
244+03000000ef03000000000000090000000000000000000000000000006e657420
245+7469746c6500000016008d00010050000100500000000000000000000a001400
246+2c01c8000000000009008d000100500000000000000000000000000000000000
247+000000000000000013008d000001000001005000000000000000000000000000
248+00000000000000001c008d0001005000f3030000000000000000000000000000
249+000000000000000001088e0003000000ef030000000000000900000000000000
250+00000000000000006e6574207469746c6500000016008e000100500001005000
251+00000000000000000a0014002c01c8000000000009008e000100500000000000
252+000000000000000000000000000000000000000013008e000001000001005000
253+00000000000000000000000000000000000000001c008e0001005000f3030000
254+000000000000000000000000000000000000000001088f0003000000ef030000
255+00000000090000000000000000000000000000006e6574207469746c65000000
256+16008f00010050000100500000000000000000000a0014002c01c80000000000
257+09008f0001005000000000000000000000000000000000000000000000000000
258+13008f0000010000010050000000000000000000000000000000000000000000
259+1c008f0001005000f30300000000000000000000000000000000000000000000
260+0108900003000000ef0300000000000009000000000000000000000000000000
261+6e6574207469746c650000001600900001005000010050000000000000000000
262+0a0014002c01c800000000000900900001005000000000000000000000000000
263+0000000000000000000000001300900000010000010050000000000000000000
264+0000000000000000000000001c00900001005000f30300000000000000000000
265+0000000000000000000000000108910003000000ef0300000000000009000000
266+0000000000000000000000006e6574207469746c650000001600910001005000
267+0100500000000000000000000a0014002c01c800000000000900910001005000
268+0000000000000000000000000000000000000000000000001300910000010000
269+0100500000000000000000000000000000000000000000001c00910001005000
270+f303000000000000000000000000000000000000000000000108920003000000
271+ef03000000000000090000000000000000000000000000006e6574207469746c
272+6500000016009200010050000100500000000000000000000a0014002c01c800
273+0000000009009200010050000000000000000000000000000000000000000000
274+0000000013009200000100000100500000000000000000000000000000000000
275+000000001c00920001005000f303000000000000000000000000000000000000
276+000000000108930003000000ef03000000000000090000000000000000000000
277+000000006e6574207469746c6500000016009300010050000100500000000000
278+000000000a0014002c01c8000000000009009300010050000000000000000000
279+0000000000000000000000000000000013009300000100000100500000000000
280+000000000000000000000000000000001c00930001005000f303000000000000
281+000000000000000000000000000000000108940003000000ef03000000000000
282+090000000000000000000000000000006e6574207469746c6500000016009400
283+010050000100500000000000000000000a0014002c01c8000000000009009400
284+0100500000000000000000000000000000000000000000000000000013009400
285+000100000100500000000000000000000000000000000000000000001c009400
286+01005000f3030000000000000000000000000000000000000000000001089500
287+03000000ef03000000000000090000000000000000000000000000006e657420
288+7469746c6500000016009500010050000100500000000000000000000a001400
289+2c01c80000000000090095000100500000000000000000000000000000000000
290+0000000000000000130095000001000001005000000000000000000000000000
291+00000000000000001c00950001005000f3030000000000000000000000000000
292+00000000000000000108960003000000ef030000000000000900000000000000
293+00000000000000006e6574207469746c65000000160096000100500001005000
294+00000000000000000a0014002c01c80000000000090096000100500000000000
295+0000000000000000000000000000000000000000130096000001000001005000
296+00000000000000000000000000000000000000001c00960001005000f3030000
297+00000000000000000000000000000000000000000108970003000000ef030000
298+00000000090000000000000000000000000000006e6574207469746c65000000
299+16009700010050000100500000000000000000000a0014002c01c80000000000
300+0900970001005000000000000000000000000000000000000000000000000000
301+1300970000010000010050000000000000000000000000000000000000000000
302+1c00970001005000f30300000000000000000000000000000000000000000000
303+0108980003000000ef0300000000000009000000000000000000000000000000
304+6e6574207469746c650000001600980001005000010050000000000000000000
305+0a0014002c01c800000000000900980001005000000000000000000000000000
306+0000000000000000000000001300980000010000010050000000000000000000
307+0000000000000000000000001c00980001005000f30300000000000000000000
308+0000000000000000000000000108990003000000ef0300000000000009000000
309+0000000000000000000000006e6574207469746c650000001600990001005000
310+0100500000000000000000000a0014002c01c800000000000900990001005000
311+0000000000000000000000000000000000000000000000001300990000010000
312+0100500000000000000000000000000000000000000000001c00990001005000
313+f3030000000000000000000000000000000000000000000001089a0003000000
314+ef03000000000000090000000000000000000000000000006e6574207469746c
315+6500000016009a00010050000100500000000000000000000a0014002c01c800
316+0000000009009a00010050000000000000000000000000000000000000000000
317+0000000013009a00000100000100500000000000000000000000000000000000
318+000000001c009a0001005000f303000000000000000000000000000000000000
319+0000000001089b0003000000ef03000000000000090000000000000000000000
320+000000006e6574207469746c6500000016009b00010050000100500000000000
321+000000000a0014002c01c8000000000009009b00010050000000000000000000
322+0000000000000000000000000000000013009b00000100000100500000000000
323+000000000000000000000000000000001c009b0001005000f303000000000000
324+0000000000000000000000000000000001089c0003000000ef03000000000000
325+090000000000000000000000000000006e6574207469746c6500000016009c00
326+010050000100500000000000000000000a0014002c01c8000000000009009c00
327+0100500000000000000000000000000000000000000000000000000013009c00
328+000100000100500000000000000000000000000000000000000000001c009c00
329+01005000f3030000000000000000000000000000000000000000000001089d00
330+03000000ef03000000000000090000000000000000000000000000006e657420
331+7469746c6500000016009d00010050000100500000000000000000000a001400
332+2c01c8000000000009009d000100500000000000000000000000000000000000
333+000000000000000013009d000001000001005000000000000000000000000000
334+00000000000000001c009d0001005000f3030000000000000000000000000000
335+000000000000000001089e0003000000ef030000000000000900000000000000
336+00000000000000006e6574207469746c6500000016009e000100500001005000
337+00000000000000000a0014002c01c8000000000009009e000100500000000000
338+000000000000000000000000000000000000000013009e000001000001005000
339+00000000000000000000000000000000000000001c009e0001005000f3030000
340+000000000000000000000000000000000000000001089f0003000000ef030000
341+00000000090000000000000000000000000000006e6574207469746c65000000
342+16009f00010050000100500000000000000000000a0014002c01c80000000000
343+09009f0001005000000000000000000000000000000000000000000000000000
344+13009f0000010000010050000000000000000000000000000000000000000000
345+1c009f0001005000f30300000000000000000000000000000000000000000000
346+0108a00003000000ef0300000000000009000000000000000000000000000000
347+6e6574207469746c650000001600a00001005000010050000000000000000000
348+0a0014002c01c800000000000900a00001005000000000000000000000000000
349+0000000000000000000000001300a00000010000010050000000000000000000
350+0000000000000000000000001c00a00001005000f30300000000000000000000
351+0000000000000000000000000108a10003000000ef0300000000000009000000
352+0000000000000000000000006e6574207469746c650000001600a10001005000
353+0100500000000000000000000a0014002c01c800000000000900a10001005000
354+0000000000000000000000000000000000000000000000001300a10000010000
355+0100500000000000000000000000000000000000000000001c00a10001005000
356+f303000000000000000000000000000000000000000000000108a20003000000
357+ef03000000000000090000000000000000000000000000006e6574207469746c
358+650000001600a200010050000100500000000000000000000a0014002c01c800
359+000000000900a200010050000000000000000000000000000000000000000000
360+000000001300a200000100000100500000000000000000000000000000000000
361+000000001c00a20001005000f303000000000000000000000000000000000000
362+000000000108a30003000000ef03000000000000090000000000000000000000
363+000000006e6574207469746c650000001600a300010050000100500000000000
364+000000000a0014002c01c800000000000900a300010050000000000000000000
365+000000000000000000000000000000001300a300000100000100500000000000
366+000000000000000000000000000000001c00a30001005000f303000000000000
367+000000000000000000000000000000000108a40003000000ef03000000000000
368+090000000000000000000000000000006e6574207469746c650000001600a400
369+010050000100500000000000000000000a0014002c01c800000000000900a400
370+010050000000000000000000000000000000000000000000000000001300a400
371+000100000100500000000000000000000000000000000000000000001c00a400
372+01005000f303000000000000000000000000000000000000000000000108a500
373+03000000ef03000000000000090000000000000000000000000000006e657420
374+7469746c650000001600a500010050000100500000000000000000000a001400
375+2c01c800000000000900a5000100500000000000000000000000000000000000
376+00000000000000001300a5000001000001005000000000000000000000000000
377+00000000000000001c00a50001005000f3030000000000000000000000000000
378+00000000000000000108a60003000000ef030000000000000900000000000000
379+00000000000000006e6574207469746c650000001600a6000100500001005000
380+00000000000000000a0014002c01c800000000000900a6000100500000000000
381+00000000000000000000000000000000000000001300a6000001000001005000
382+00000000000000000000000000000000000000001c00a60001005000f3030000
383+00000000000000000000000000000000000000000108a70003000000ef030000
384+00000000090000000000000000000000000000006e6574207469746c65000000
385+1600a700010050000100500000000000000000000a0014002c01c80000000000
386+0900a70001005000000000000000000000000000000000000000000000000000
387+1300a70000010000010050000000000000000000000000000000000000000000
388+1c00a70001005000f30300000000000000000000000000000000000000000000
389+0108a80003000000ef0300000000000009000000000000000000000000000000
390+6e6574207469746c650000001600a80001005000010050000000000000000000
391+0a0014002c01c800000000000900a80001005000000000000000000000000000
392+0000000000000000000000001300a80000010000010050000000000000000000
393+0000000000000000000000001c00a80001005000f30300000000000000000000
394+0000000000000000000000000108a90003000000ef0300000000000009000000
395+0000000000000000000000006e6574207469746c650000001600a90001005000
396+0100500000000000000000000a0014002c01c800000000000900a90001005000
397+0000000000000000000000000000000000000000000000001300a90000010000
398+0100500000000000000000000000000000000000000000001c00a90001005000
399+f303000000000000000000000000000000000000000000000108aa0003000000
400+ef03000000000000090000000000000000000000000000006e6574207469746c
401+650000001600aa00010050000100500000000000000000000a0014002c01c800
402+000000000900aa00010050000000000000000000000000000000000000000000
403+000000001300aa00000100000100500000000000000000000000000000000000
404+000000001c00aa0001005000f303000000000000000000000000000000000000
405+000000000108ab0003000000ef03000000000000090000000000000000000000
406+000000006e6574207469746c650000001600ab00010050000100500000000000
407+000000000a0014002c01c800000000000900ab00010050000000000000000000
408+000000000000000000000000000000001300ab00000100000100500000000000
409+000000000000000000000000000000001c00ab0001005000f303000000000000
410+000000000000000000000000000000000108ac0003000000ef03000000000000
411+090000000000000000000000000000006e6574207469746c650000001600ac00
412+010050000100500000000000000000000a0014002c01c800000000000900ac00
413+010050000000000000000000000000000000000000000000000000001300ac00
414+000100000100500000000000000000000000000000000000000000001c00ac00
415+01005000f303000000000000000000000000000000000000000000000108ad00
416+03000000ef03000000000000090000000000000000000000000000006e657420
417+7469746c650000001600ad00010050000100500000000000000000000a001400
418+2c01c800000000000900ad000100500000000000000000000000000000000000
419+00000000000000001300ad000001000001005000000000000000000000000000
420+00000000000000001c00ad0001005000f3030000000000000000000000000000
421+00000000000000000108ae0003000000ef030000000000000900000000000000
422+00000000000000006e6574207469746c650000001600ae000100500001005000
423+00000000000000000a0014002c01c800000000000900ae000100500000000000
424+00000000000000000000000000000000000000001300ae000001000001005000
425+00000000000000000000000000000000000000001c00ae0001005000f3030000
426+00000000000000000000000000000000000000000108af0003000000ef030000
427+00000000090000000000000000000000000000006e6574207469746c65000000
428+1600af00010050000100500000000000000000000a0014002c01c80000000000
429+0900af0001005000000000000000000000000000000000000000000000000000
430+1300af0000010000010050000000000000000000000000000000000000000000
431+1c00af0001005000f30300000000000000000000000000000000000000000000
432+0108b00003000000ef0300000000000009000000000000000000000000000000
433+6e6574207469746c650000001600b00001005000010050000000000000000000
434+0a0014002c01c800000000000900b00001005000000000000000000000000000
435+0000000000000000000000001300b00000010000010050000000000000000000
436+0000000000000000000000001c00b00001005000f30300000000000000000000
437+0000000000000000000000000108b10003000000ef0300000000000009000000
438+0000000000000000000000006e6574207469746c650000001600b10001005000
439+0100500000000000000000000a0014002c01c800000000000900b10001005000
440+0000000000000000000000000000000000000000000000001300b10000010000
441+0100500000000000000000000000000000000000000000001c00b10001005000
442+f303000000000000000000000000000000000000000000000108b20003000000
443+ef03000000000000090000000000000000000000000000006e6574207469746c
444+650000001600b200010050000100500000000000000000000a0014002c01c800
445+000000000900b200010050000000000000000000000000000000000000000000
446+000000001300b200000100000100500000000000000000000000000000000000
447+000000001c00b20001005000f303000000000000000000000000000000000000
448+000000000108b30003000000ef03000000000000090000000000000000000000
449+000000006e6574207469746c650000001600b300010050000100500000000000
450+000000000a0014002c01c800000000000900b300010050000000000000000000
451+000000000000000000000000000000001300b300000100000100500000000000
452+000000000000000000000000000000001c00b30001005000f303000000000000
453+000000000000000000000000000000000108b40003000000ef03000000000000
454+090000000000000000000000000000006e6574207469746c650000001600b400
455+010050000100500000000000000000000a0014002c01c800000000000900b400
456+010050000000000000000000000000000000000000000000000000001300b400
457+000100000100500000000000000000000000000000000000000000001c00b400
458+01005000f303000000000000000000000000000000000000000000000108b500
459+03000000ef03000000000000090000000000000000000000000000006e657420
460+7469746c650000001600b500010050000100500000000000000000000a001400
461+2c01c800000000000900b5000100500000000000000000000000000000000000
462+00000000000000001300b5000001000001005000000000000000000000000000
463+00000000000000001c00b50001005000f3030000000000000000000000000000
464+00000000000000000108b60003000000ef030000000000000900000000000000
465+00000000000000006e6574207469746c650000001600b6000100500001005000
466+00000000000000000a0014002c01c800000000000900b6000100500000000000
467+00000000000000000000000000000000000000001300b6000001000001005000
468+00000000000000000000000000000000000000001c00b60001005000f3030000
469+00000000000000000000000000000000000000000108b70003000000ef030000
470+00000000090000000000000000000000000000006e6574207469746c65000000
471+1600b700010050000100500000000000000000000a0014002c01c80000000000
472+0900b70001005000000000000000000000000000000000000000000000000000
473+1300b70000010000010050000000000000000000000000000000000000000000
474+1c00b70001005000f30300000000000000000000000000000000000000000000
475+0108b80003000000ef0300000000000009000000000000000000000000000000
476+6e6574207469746c650000001600b80001005000010050000000000000000000
477+0a0014002c01c800000000000900b80001005000000000000000000000000000
478+0000000000000000000000001300b80000010000010050000000000000000000
479+0000000000000000000000001c00b80001005000f30300000000000000000000
480+0000000000000000000000000108b90003000000ef0300000000000009000000
481+0000000000000000000000006e6574207469746c650000001600b90001005000
482+0100500000000000000000000a0014002c01c800000000000900b90001005000
483+0000000000000000000000000000000000000000000000001300b90000010000
484+0100500000000000000000000000000000000000000000001c00b90001005000
485+f303000000000000000000000000000000000000000000000108ba0003000000
486+ef03000000000000090000000000000000000000000000006e6574207469746c
487+650000001600ba00010050000100500000000000000000000a0014002c01c800
488+000000000900ba00010050000000000000000000000000000000000000000000
489+000000001300ba00000100000100500000000000000000000000000000000000
490+000000001c00ba0001005000f303000000000000000000000000000000000000
491+000000000108bb0003000000ef03000000000000090000000000000000000000
492+000000006e6574207469746c650000001600bb00010050000100500000000000
493+000000000a0014002c01c800000000000900bb00010050000000000000000000
494+000000000000000000000000000000001300bb00000100000100500000000000
495+000000000000000000000000000000001c00bb0001005000f303000000000000
496+000000000000000000000000000000000108bc0003000000ef03000000000000
497+090000000000000000000000000000006e6574207469746c650000001600bc00
498+010050000100500000000000000000000a0014002c01c800000000000900bc00
499+010050000000000000000000000000000000000000000000000000001300bc00
500+000100000100500000000000000000000000000000000000000000001c00bc00
501+01005000f303000000000000000000000000000000000000000000000108bd00
502+03000000ef03000000000000090000000000000000000000000000006e657420
503+7469746c650000001600bd00010050000100500000000000000000000a001400
504+2c01c800000000000900bd000100500000000000000000000000000000000000
505+00000000000000001300bd000001000001005000000000000000000000000000
506+00000000000000001c00bd0001005000f3030000000000000000000000000000
507+00000000000000000108be0003000000ef030000000000000900000000000000
508+00000000000000006e6574207469746c650000001600be000100500001005000
509+00000000000000000a0014002c01c800000000000900be000100500000000000
510+00000000000000000000000000000000000000001300be000001000001005000
511+00000000000000000000000000000000000000001c00be0001005000f3030000
512+00000000000000000000000000000000000000000108bf0003000000ef030000
513+00000000090000000000000000000000000000006e6574207469746c65000000
514+1600bf00010050000100500000000000000000000a0014002c01c80000000000
515+0900bf0001005000000000000000000000000000000000000000000000000000
516+1300bf0000010000010050000000000000000000000000000000000000000000
517+1c00bf0001005000f30300000000000000000000000000000000000000000000
518+0108c00003000000ef0300000000000009000000000000000000000000000000
519+6e6574207469746c650000001600c00001005000010050000000000000000000
520+0a0014002c01c800000000000900c00001005000000000000000000000000000
521+0000000000000000000000001300c00000010000010050000000000000000000
522+0000000000000000000000001c00c00001005000f30300000000000000000000
523+0000000000000000000000000108c10003000000ef0300000000000009000000
524+0000000000000000000000006e6574207469746c650000001600c10001005000
525+0100500000000000000000000a0014002c01c800000000000900c10001005000
526+0000000000000000000000000000000000000000000000001300c10000010000
527+0100500000000000000000000000000000000000000000001c00c10001005000
528+f303000000000000000000000000000000000000000000000108c20003000000
529+ef03000000000000090000000000000000000000000000006e6574207469746c
530+650000001600c200010050000100500000000000000000000a0014002c01c800
531+000000000900c200010050000000000000000000000000000000000000000000
532+000000001300c200000100000100500000000000000000000000000000000000
533+000000001c00c20001005000f303000000000000000000000000000000000000
534+000000000108c30003000000ef03000000000000090000000000000000000000
535+000000006e6574207469746c650000001600c300010050000100500000000000
536+000000000a0014002c01c800000000000900c300010050000000000000000000
537+000000000000000000000000000000001300c300000100000100500000000000
538+000000000000000000000000000000001c00c30001005000f303000000000000
539+000000000000000000000000000000000108c40003000000ef03000000000000
540+090000000000000000000000000000006e6574207469746c650000001600c400
541+010050000100500000000000000000000a0014002c01c800000000000900c400
542+010050000000000000000000000000000000000000000000000000001300c400
543+000100000100500000000000000000000000000000000000000000001c00c400
544+01005000f303000000000000000000000000000000000000000000000108c500
545+03000000ef03000000000000090000000000000000000000000000006e657420
546+7469746c650000001600c500010050000100500000000000000000000a001400
547+2c01c800000000000900c5000100500000000000000000000000000000000000
548+00000000000000001300c5000001000001005000000000000000000000000000
549+00000000000000001c00c50001005000f3030000000000000000000000000000
550+00000000000000000108c60003000000ef030000000000000900000000000000
551+00000000000000006e6574207469746c650000001600c6000100500001005000
552+00000000000000000a0014002c01c800000000000900c6000100500000000000
553+00000000000000000000000000000000000000001300c6000001000001005000
554+00000000000000000000000000000000000000001c00c60001005000f3030000
555+00000000000000000000000000000000000000000108c70003000000ef030000
556+00000000090000000000000000000000000000006e6574207469746c65000000
557+1600c700010050000100500000000000000000000a0014002c01c80000000000
558+0900c70001005000000000000000000000000000000000000000000000000000
559+1300c70000010000010050000000000000000000000000000000000000000000
560+1c00c70001005000f30300000000000000000000000000000000000000000000
561+0108c80003000000ef0300000000000009000000000000000000000000000000
562+6e6574207469746c650000001600c80001005000010050000000000000000000
563+0a0014002c01c800000000000900c80001005000000000000000000000000000
564+0000000000000000000000001300c80000010000010050000000000000000000
565+0000000000000000000000001c00c80001005000f30300000000000000000000
566+0000000000000000000000000108c90003000000ef0300000000000009000000
567+0000000000000000000000006e6574207469746c650000001600c90001005000
568+0100500000000000000000000a0014002c01c800000000000900c90001005000
569+0000000000000000000000000000000000000000000000001300c90000010000
570+0100500000000000000000000000000000000000000000001c00c90001005000
571+f303000000000000000000000000000000000000000000000108ca0003000000
572+ef03000000000000090000000000000000000000000000006e6574207469746c
573+650000001600ca00010050000100500000000000000000000a0014002c01c800
574+000000000900ca00010050000000000000000000000000000000000000000000
575+000000001300ca00000100000100500000000000000000000000000000000000
576+000000001c00ca0001005000f303000000000000000000000000000000000000
577+000000000108cb0003000000ef03000000000000090000000000000000000000
578+000000006e6574207469746c650000001600cb00010050000100500000000000
579+000000000a0014002c01c800000000000900cb00010050000000000000000000
580+000000000000000000000000000000001300cb00000100000100500000000000
581+000000000000000000000000000000001c00cb0001005000f303000000000000
582+000000000000000000000000000000000108cc0003000000ef03000000000000
583+090000000000000000000000000000006e6574207469746c650000001600cc00
584+010050000100500000000000000000000a0014002c01c800000000000900cc00
585+010050000000000000000000000000000000000000000000000000001300cc00
586+000100000100500000000000000000000000000000000000000000001c00cc00
587+01005000f303000000000000000000000000000000000000000000000108cd00
588+03000000ef03000000000000090000000000000000000000000000006e657420
589+7469746c650000001600cd00010050000100500000000000000000000a001400
590+2c01c800000000000900cd000100500000000000000000000000000000000000
591+00000000000000001300cd000001000001005000000000000000000000000000
592+00000000000000001c00cd0001005000f3030000000000000000000000000000
593+00000000000000000108ce0003000000ef030000000000000900000000000000
594+00000000000000006e6574207469746c650000001600ce000100500001005000
595+00000000000000000a0014002c01c800000000000900ce000100500000000000
596+00000000000000000000000000000000000000001300ce000001000001005000
597+00000000000000000000000000000000000000001c00ce0001005000f3030000
598+00000000000000000000000000000000000000000108cf0003000000ef030000
599+00000000090000000000000000000000000000006e6574207469746c65000000
600+1600cf00010050000100500000000000000000000a0014002c01c80000000000
601+0900cf0001005000000000000000000000000000000000000000000000000000
602+1300cf0000010000010050000000000000000000000000000000000000000000
603+1c00cf0001005000f30300000000000000000000000000000000000000000000
604+0108d00003000000ef0300000000000009000000000000000000000000000000
605+6e6574207469746c650000001600d00001005000010050000000000000000000
606+0a0014002c01c800000000000900d00001005000000000000000000000000000
607+0000000000000000000000001300d00000010000010050000000000000000000
608+0000000000000000000000001c00d00001005000f30300000000000000000000
609+0000000000000000000000000108d10003000000ef0300000000000009000000
610+0000000000000000000000006e6574207469746c650000001600d10001005000
611+0100500000000000000000000a0014002c01c800000000000900d10001005000
612+0000000000000000000000000000000000000000000000001300d10000010000
613+0100500000000000000000000000000000000000000000001c00d10001005000
614+f303000000000000000000000000000000000000000000000108d20003000000
615+ef03000000000000090000000000000000000000000000006e6574207469746c
616+650000001600d200010050000100500000000000000000000a0014002c01c800
617+000000000900d200010050000000000000000000000000000000000000000000
618+000000001300d200000100000100500000000000000000000000000000000000
619+000000001c00d20001005000f303000000000000000000000000000000000000
620+000000000108d30003000000ef03000000000000090000000000000000000000
621+000000006e6574207469746c650000001600d300010050000100500000000000
622+000000000a0014002c01c800000000000900d300010050000000000000000000
623+000000000000000000000000000000001300d300000100000100500000000000
624+000000000000000000000000000000001c00d30001005000f303000000000000
625+000000000000000000000000000000000108d40003000000ef03000000000000
626+090000000000000000000000000000006e6574207469746c650000001600d400
627+010050000100500000000000000000000a0014002c01c800000000000900d400
628+010050000000000000000000000000000000000000000000000000001300d400
629+000100000100500000000000000000000000000000000000000000001c00d400
630+01005000f303000000000000000000000000000000000000000000000108d500
631+03000000ef03000000000000090000000000000000000000000000006e657420
632+7469746c650000001600d500010050000100500000000000000000000a001400
633+2c01c800000000000900d5000100500000000000000000000000000000000000
634+00000000000000001300d5000001000001005000000000000000000000000000
635+00000000000000001c00d50001005000f3030000000000000000000000000000
636+00000000000000000108d60003000000ef030000000000000900000000000000
637+00000000000000006e6574207469746c650000001600d6000100500001005000
638+00000000000000000a0014002c01c800000000000900d6000100500000000000
639+00000000000000000000000000000000000000001300d6000001000001005000
640+00000000000000000000000000000000000000001c00d60001005000f3030000
641+00000000000000000000000000000000000000000108d70003000000ef030000
642+00000000090000000000000000000000000000006e6574207469746c65000000
643+1600d700010050000100500000000000000000000a0014002c01c80000000000
644+0900d70001005000000000000000000000000000000000000000000000000000
645+1300d70000010000010050000000000000000000000000000000000000000000
646+1c00d70001005000f30300000000000000000000000000000000000000000000
647+0108d80003000000ef0300000000000009000000000000000000000000000000
648+6e6574207469746c650000001600d80001005000010050000000000000000000
649+0a0014002c01c800000000000900d80001005000000000000000000000000000
650+0000000000000000000000001300d80000010000010050000000000000000000
651+0000000000000000000000001c00d80001005000f30300000000000000000000
652+0000000000000000000000000108d90003000000ef0300000000000009000000
653+0000000000000000000000006e6574207469746c650000001600d90001005000
654+0100500000000000000000000a0014002c01c800000000000900d90001005000
655+0000000000000000000000000000000000000000000000001300d90000010000
656+0100500000000000000000000000000000000000000000001c00d90001005000
657+f303000000000000000000000000000000000000000000000108da0003000000
658+ef03000000000000090000000000000000000000000000006e6574207469746c
659+650000001600da00010050000100500000000000000000000a0014002c01c800
660+000000000900da00010050000000000000000000000000000000000000000000
661+000000001300da00000100000100500000000000000000000000000000000000
662+000000001c00da0001005000f303000000000000000000000000000000000000
663+000000000108db0003000000ef03000000000000090000000000000000000000
664+000000006e6574207469746c650000001600db00010050000100500000000000
665+000000000a0014002c01c800000000000900db00010050000000000000000000
666+000000000000000000000000000000001300db00000100000100500000000000
667+000000000000000000000000000000001c00db0001005000f303000000000000
668+000000000000000000000000000000000108dc0003000000ef03000000000000
669+090000000000000000000000000000006e6574207469746c650000001600dc00
670+010050000100500000000000000000000a0014002c01c800000000000900dc00
671+010050000000000000000000000000000000000000000000000000001300dc00
672+000100000100500000000000000000000000000000000000000000001c00dc00
673+01005000f303000000000000000000000000000000000000000000000108dd00
674+03000000ef03000000000000090000000000000000000000000000006e657420
675+7469746c650000001600dd00010050000100500000000000000000000a001400
676+2c01c800000000000900dd000100500000000000000000000000000000000000
677+00000000000000001300dd000001000001005000000000000000000000000000
678+00000000000000001c00dd0001005000f3030000000000000000000000000000
679+00000000000000000108de0003000000ef030000000000000900000000000000
680+00000000000000006e6574207469746c650000001600de000100500001005000
681+00000000000000000a0014002c01c800000000000900de000100500000000000
682+00000000000000000000000000000000000000001300de000001000001005000
683+00000000000000000000000000000000000000001c00de0001005000f3030000
684+00000000000000000000000000000000000000000108df0003000000ef030000
685+00000000090000000000000000000000000000006e6574207469746c65000000
686+1600df00010050000100500000000000000000000a0014002c01c80000000000
687+0900df0001005000000000000000000000000000000000000000000000000000
688+1300df0000010000010050000000000000000000000000000000000000000000
689+1c00df0001005000f30300000000000000000000000000000000000000000000
690+0108e00003000000ef0300000000000009000000000000000000000000000000
691+6e6574207469746c650000001600e00001005000010050000000000000000000
692+0a0014002c01c800000000000900e00001005000000000000000000000000000
693+0000000000000000000000001300e00000010000010050000000000000000000
694+0000000000000000000000001c00e00001005000f30300000000000000000000
695+0000000000000000000000000108e10003000000ef0300000000000009000000
696+0000000000000000000000006e6574207469746c650000001600e10001005000
697+0100500000000000000000000a0014002c01c800000000000900e10001005000
698+0000000000000000000000000000000000000000000000001300e10000010000
699+0100500000000000000000000000000000000000000000001c00e10001005000
700+f303000000000000000000000000000000000000000000000108e20003000000
701+ef03000000000000090000000000000000000000000000006e6574207469746c
702+650000001600e200010050000100500000000000000000000a0014002c01c800
703+000000000900e200010050000000000000000000000000000000000000000000
704+000000001300e200000100000100500000000000000000000000000000000000
705+000000001c00e20001005000f303000000000000000000000000000000000000
706+000000000108e30003000000ef03000000000000090000000000000000000000
707+000000006e6574207469746c650000001600e300010050000100500000000000
708+000000000a0014002c01c800000000000900e300010050000000000000000000
709+000000000000000000000000000000001300e300000100000100500000000000
710+000000000000000000000000000000001c00e30001005000f303000000000000
711+000000000000000000000000000000000108e40003000000ef03000000000000
712+090000000000000000000000000000006e6574207469746c650000001600e400
713+010050000100500000000000000000000a0014002c01c800000000000900e400
714+010050000000000000000000000000000000000000000000000000001300e400
715+000100000100500000000000000000000000000000000000000000001c00e400
716+01005000f303000000000000000000000000000000000000000000000108e500
717+03000000ef03000000000000090000000000000000000000000000006e657420
718+7469746c650000001600e500010050000100500000000000000000000a001400
719+2c01c800000000000900e5000100500000000000000000000000000000000000
720+00000000000000001300e5000001000001005000000000000000000000000000
721+00000000000000001c00e50001005000f3030000000000000000000000000000
722+00000000000000000108e60003000000ef030000000000000900000000000000
723+00000000000000006e6574207469746c650000001600e6000100500001005000
724+00000000000000000a0014002c01c800000000000900e6000100500000000000
725+00000000000000000000000000000000000000001300e6000001000001005000
726+00000000000000000000000000000000000000001c00e60001005000f3030000
727+00000000000000000000000000000000000000000108e70003000000ef030000
728+00000000090000000000000000000000000000006e6574207469746c65000000
729+1600e700010050000100500000000000000000000a0014002c01c80000000000
730+0900e70001005000000000000000000000000000000000000000000000000000
731+1300e70000010000010050000000000000000000000000000000000000000000
732+1c00e70001005000f30300000000000000000000000000000000000000000000
733+0108e80003000000ef0300000000000009000000000000000000000000000000
734+6e6574207469746c650000001600e80001005000010050000000000000000000
735+0a0014002c01c800000000000900e80001005000000000000000000000000000
736+0000000000000000000000001300e80000010000010050000000000000000000
737+0000000000000000000000001c00e80001005000f30300000000000000000000
738+0000000000000000000000000108e90003000000ef0300000000000009000000
739+0000000000000000000000006e6574207469746c650000001600e90001005000
740+0100500000000000000000000a0014002c01c800000000000900e90001005000
741+0000000000000000000000000000000000000000000000001300e90000010000
742+0100500000000000000000000000000000000000000000001c00e90001005000
743+f303000000000000000000000000000000000000000000000108ea0003000000
744+ef03000000000000090000000000000000000000000000006e6574207469746c
745+650000001600ea00010050000100500000000000000000000a0014002c01c800
746+000000000900ea00010050000000000000000000000000000000000000000000
747+000000001300ea00000100000100500000000000000000000000000000000000
748+000000001c00ea0001005000f303000000000000000000000000000000000000
749+000000000108eb0003000000ef03000000000000090000000000000000000000
750+000000006e6574207469746c650000001600eb00010050000100500000000000
751+000000000a0014002c01c800000000000900eb00010050000000000000000000
752+000000000000000000000000000000001300eb00000100000100500000000000
753+000000000000000000000000000000001c00eb0001005000f303000000000000
754+000000000000000000000000000000000108ec0003000000ef03000000000000
755+090000000000000000000000000000006e6574207469746c650000001600ec00
756+010050000100500000000000000000000a0014002c01c800000000000900ec00
757+010050000000000000000000000000000000000000000000000000001300ec00
758+000100000100500000000000000000000000000000000000000000001c00ec00
759+01005000f303000000000000000000000000000000000000000000000108ed00
760+03000000ef03000000000000090000000000000000000000000000006e657420
761+7469746c650000001600ed00010050000100500000000000000000000a001400
762+2c01c800000000000900ed000100500000000000000000000000000000000000
763+00000000000000001300ed000001000001005000000000000000000000000000
764+00000000000000001c00ed0001005000f3030000000000000000000000000000
765+00000000000000000108ee0003000000ef030000000000000900000000000000
766+00000000000000006e6574207469746c650000001600ee000100500001005000
767+00000000000000000a0014002c01c800000000000900ee000100500000000000
768+00000000000000000000000000000000000000001300ee000001000001005000
769+00000000000000000000000000000000000000001c00ee0001005000f3030000
770+00000000000000000000000000000000000000000108ef0003000000ef030000
771+00000000090000000000000000000000000000006e6574207469746c65000000
772+1600ef00010050000100500000000000000000000a0014002c01c80000000000
773+0900ef0001005000000000000000000000000000000000000000000000000000
774+1300ef0000010000010050000000000000000000000000000000000000000000
775+1c00ef0001005000f30300000000000000000000000000000000000000000000
776+0108f00003000000ef0300000000000009000000000000000000000000000000
777+6e6574207469746c650000001600f00001005000010050000000000000000000
778+0a0014002c01c800000000000900f00001005000000000000000000000000000
779+0000000000000000000000001300f00000010000010050000000000000000000
780+0000000000000000000000001c00f00001005000f30300000000000000000000
781+0000000000000000000000000108f10003000000ef0300000000000009000000
782+0000000000000000000000006e6574207469746c650000001600f10001005000
783+0100500000000000000000000a0014002c01c800000000000900f10001005000
784+0000000000000000000000000000000000000000000000001300f10000010000
785+0100500000000000000000000000000000000000000000001c00f10001005000
786+f303000000000000000000000000000000000000000000000108f20003000000
787+ef03000000000000090000000000000000000000000000006e6574207469746c
788+650000001600f200010050000100500000000000000000000a0014002c01c800
789+000000000900f200010050000000000000000000000000000000000000000000
790+000000001300f200000100000100500000000000000000000000000000000000
791+000000001c00f20001005000f303000000000000000000000000000000000000
792+000000000108f30003000000ef03000000000000090000000000000000000000
793+000000006e6574207469746c650000001600f300010050000100500000000000
794+000000000a0014002c01c800000000000900f300010050000000000000000000
795+000000000000000000000000000000001300f300000100000100500000000000
796+000000000000000000000000000000001c00f30001005000f303000000000000
797+000000000000000000000000000000000108f40003000000ef03000000000000
798+090000000000000000000000000000006e6574207469746c650000001600f400
799+010050000100500000000000000000000a0014002c01c800000000000900f400
800+010050000000000000000000000000000000000000000000000000001300f400
801+000100000100500000000000000000000000000000000000000000001c00f400
802+01005000f303000000000000000000000000000000000000000000000108f500
803+03000000ef03000000000000090000000000000000000000000000006e657420
804+7469746c650000001600f500010050000100500000000000000000000a001400
805+2c01c800000000000900f5000100500000000000000000000000000000000000
806+00000000000000001300f5000001000001005000000000000000000000000000
807+00000000000000001c00f50001005000f3030000000000000000000000000000
808+00000000000000000108f60003000000ef030000000000000900000000000000
809+00000000000000006e6574207469746c650000001600f6000100500001005000
810+00000000000000000a0014002c01c800000000000900f6000100500000000000
811+00000000000000000000000000000000000000001300f6000001000001005000
812+00000000000000000000000000000000000000001c00f60001005000f3030000
813+00000000000000000000000000000000000000000108f70003000000ef030000
814+00000000090000000000000000000000000000006e6574207469746c65000000
815+1600f700010050000100500000000000000000000a0014002c01c80000000000
816+0900f70001005000000000000000000000000000000000000000000000000000
817+1300f70000010000010050000000000000000000000000000000000000000000
818+1c00f70001005000f30300000000000000000000000000000000000000000000
819+0108f80003000000ef0300000000000009000000000000000000000000000000
820+6e6574207469746c650000001600f80001005000010050000000000000000000
821+0a0014002c01c800000000000900f80001005000000000000000000000000000
822+0000000000000000000000001300f80000010000010050000000000000000000
823+0000000000000000000000001c00f80001005000f30300000000000000000000
824+0000000000000000000000000108f90003000000ef0300000000000009000000
825+0000000000000000000000006e6574207469746c650000001600f90001005000
826+0100500000000000000000000a0014002c01c800000000000900f90001005000
827+0000000000000000000000000000000000000000000000001300f90000010000
828+0100500000000000000000000000000000000000000000001c00f90001005000
829+f303000000000000000000000000000000000000000000000108fa0003000000
830+ef03000000000000090000000000000000000000000000006e6574207469746c
831+650000001600fa00010050000100500000000000000000000a0014002c01c800
832+000000000900fa00010050000000000000000000000000000000000000000000
833+000000001300fa00000100000100500000000000000000000000000000000000
834+000000001c00fa0001005000f303000000000000000000000000000000000000
835+000000000108fb0003000000ef03000000000000090000000000000000000000
836+000000006e6574207469746c650000001600fb00010050000100500000000000
837+000000000a0014002c01c800000000000900fb00010050000000000000000000
838+000000000000000000000000000000001300fb00000100000100500000000000
839+000000000000000000000000000000001c00fb0001005000f303000000000000
840+000000000000000000000000000000000108fc0003000000ef03000000000000
841+090000000000000000000000000000006e6574207469746c650000001600fc00
842+010050000100500000000000000000000a0014002c01c800000000000900fc00
843+010050000000000000000000000000000000000000000000000000001300fc00
844+000100000100500000000000000000000000000000000000000000001c00fc00
845+01005000f303000000000000000000000000000000000000000000000108fd00
846+03000000ef03000000000000090000000000000000000000000000006e657420
847+7469746c650000001600fd00010050000100500000000000000000000a001400
848+2c01c800000000000900fd000100500000000000000000000000000000000000
849+00000000000000001300fd000001000001005000000000000000000000000000
850+00000000000000001c00fd0001005000f3030000000000000000000000000000
851+00000000000000000108fe0003000000ef030000000000000900000000000000
852+00000000000000006e6574207469746c650000001600fe000100500001005000
853+00000000000000000a0014002c01c800000000000900fe000100500000000000
854+00000000000000000000000000000000000000001300fe000001000001005000
855+00000000000000000000000000000000000000001c00fe0001005000f3030000
856+00000000000000000000000000000000000000000108ff0003000000ef030000
857+00000000090000000000000000000000000000006e6574207469746c65000000
858+1600ff00010050000100500000000000000000000a0014002c01c80000000000
859+0900ff0001005000000000000000000000000000000000000000000000000000
860+1300ff0000010000010050000000000000000000000000000000000000000000
861+1c00ff0001005000f30300000000000000000000000000000000000000000000
862+0108000103000000ef0300000000000009000000000000000000000000000000
863+6e6574207469746c650000001600000101005000010050000000000000000000
864+0a0014002c01c800000000000900000101005000000000000000000000000000
865+0000000000000000000000001300000100010000010050000000000000000000
866+0000000000000000000000001c00000101005000f30300000000000000000000
867+0000000000000000000000000108010103000000ef0300000000000009000000
868+0000000000000000000000006e6574207469746c650000001600010101005000
869+0100500000000000000000000a0014002c01c800000000000900010101005000
870+0000000000000000000000000000000000000000000000001300010100010000
871+0100500000000000000000000000000000000000000000001c00010101005000
872+f303000000000000000000000000000000000000000000000108020103000000
873+ef03000000000000090000000000000000000000000000006e6574207469746c
874+6500000016000201010050000100500000000000000000000a0014002c01c800
875+0000000009000201010050000000000000000000000000000000000000000000
876+0000000013000201000100000100500000000000000000000000000000000000
877+000000001c00020101005000f303000000000000000000000000000000000000
878+000000000108030103000000ef03000000000000090000000000000000000000
879+000000006e6574207469746c6500000016000301010050000100500000000000
880+000000000a0014002c01c8000000000009000301010050000000000000000000
881+0000000000000000000000000000000013000301000100000100500000000000
882+000000000000000000000000000000001c00030101005000f303000000000000
883+000000000000000000000000000000000108040103000000ef03000000000000
884+090000000000000000000000000000006e6574207469746c6500000016000401
885+010050000100500000000000000000000a0014002c01c8000000000009000401
886+0100500000000000000000000000000000000000000000000000000013000401
887+000100000100500000000000000000000000000000000000000000001c000401
888+01005000f3030000000000000000000000000000000000000000000001080501
889+03000000ef03000000000000090000000000000000000000000000006e657420
890+7469746c6500000016000501010050000100500000000000000000000a001400
891+2c01c80000000000090005010100500000000000000000000000000000000000
892+0000000000000000130005010001000001005000000000000000000000000000
893+00000000000000001c00050101005000f3030000000000000000000000000000
894+00000000000000000108060103000000ef030000000000000900000000000000
895+00000000000000006e6574207469746c65000000160006010100500001005000
896+00000000000000000a0014002c01c80000000000090006010100500000000000
897+0000000000000000000000000000000000000000130006010001000001005000
898+00000000000000000000000000000000000000001c00060101005000f3030000
899+00000000000000000000000000000000000000000108070103000000ef030000
900+00000000090000000000000000000000000000006e6574207469746c65000000
901+16000701010050000100500000000000000000000a0014002c01c80000000000
902+0900070101005000000000000000000000000000000000000000000000000000
903+1300070100010000010050000000000000000000000000000000000000000000
904+1c00070101005000f30300000000000000000000000000000000000000000000
905+0108080103000000ef0300000000000009000000000000000000000000000000
906+6e6574207469746c650000001600080101005000010050000000000000000000
907+0a0014002c01c800000000000900080101005000000000000000000000000000
908+0000000000000000000000001300080100010000010050000000000000000000
909+0000000000000000000000001c00080101005000f30300000000000000000000
910+0000000000000000000000000108090103000000ef0300000000000009000000
911+0000000000000000000000006e6574207469746c650000001600090101005000
912+0100500000000000000000000a0014002c01c800000000000900090101005000
913+0000000000000000000000000000000000000000000000001300090100010000
914+0100500000000000000000000000000000000000000000001c00090101005000
915+f3030000000000000000000000000000000000000000000001080a0103000000
916+ef03000000000000090000000000000000000000000000006e6574207469746c
917+6500000016000a01010050000100500000000000000000000a0014002c01c800
918+0000000009000a01010050000000000000000000000000000000000000000000
919+0000000013000a01000100000100500000000000000000000000000000000000
920+000000001c000a0101005000f303000000000000000000000000000000000000
921+0000000001080b0103000000ef03000000000000090000000000000000000000
922+000000006e6574207469746c6500000016000b01010050000100500000000000
923+000000000a0014002c01c8000000000009000b01010050000000000000000000
924+0000000000000000000000000000000013000b01000100000100500000000000
925+000000000000000000000000000000001c000b0101005000f303000000000000
926+0000000000000000000000000000000001080c0103000000ef03000000000000
927+090000000000000000000000000000006e6574207469746c6500000016000c01
928+010050000100500000000000000000000a0014002c01c8000000000009000c01
929+0100500000000000000000000000000000000000000000000000000013000c01
930+000100000100500000000000000000000000000000000000000000001c000c01
931+01005000f3030000000000000000000000000000000000000000000001080d01
932+03000000ef03000000000000090000000000000000000000000000006e657420
933+7469746c6500000016000d01010050000100500000000000000000000a001400
934+2c01c8000000000009000d010100500000000000000000000000000000000000
935+000000000000000013000d010001000001005000000000000000000000000000
936+00000000000000001c000d0101005000f3030000000000000000000000000000
937+000000000000000001080e0103000000ef030000000000000900000000000000
938+00000000000000006e6574207469746c6500000016000e010100500001005000
939+00000000000000000a0014002c01c8000000000009000e010100500000000000
940+000000000000000000000000000000000000000013000e010001000001005000
941+00000000000000000000000000000000000000001c000e0101005000f3030000
942+000000000000000000000000000000000000000001080f0103000000ef030000
943+00000000090000000000000000000000000000006e6574207469746c65000000
944+16000f01010050000100500000000000000000000a0014002c01c80000000000
945+09000f0101005000000000000000000000000000000000000000000000000000
946+13000f0100010000010050000000000000000000000000000000000000000000
947+1c000f0101005000f30300000000000000000000000000000000000000000000
948+0108100103000000ef0300000000000009000000000000000000000000000000
949+6e6574207469746c650000001600100101005000010050000000000000000000
950+0a0014002c01c800000000000900100101005000000000000000000000000000
951+0000000000000000000000001300100100010000010050000000000000000000
952+0000000000000000000000001c00100101005000f30300000000000000000000
953+0000000000000000000000000108110103000000ef0300000000000009000000
954+0000000000000000000000006e6574207469746c650000001600110101005000
955+0100500000000000000000000a0014002c01c800000000000900110101005000
956+0000000000000000000000000000000000000000000000001300110100010000
957+0100500000000000000000000000000000000000000000001c00110101005000
958+f303000000000000000000000000000000000000000000000108120103000000
959+ef03000000000000090000000000000000000000000000006e6574207469746c
960+6500000016001201010050000100500000000000000000000a0014002c01c800
961+0000000009001201010050000000000000000000000000000000000000000000
962+0000000013001201000100000100500000000000000000000000000000000000
963+000000001c00120101005000f303000000000000000000000000000000000000
964+000000000108130103000000ef03000000000000090000000000000000000000
965+000000006e6574207469746c6500000016001301010050000100500000000000
966+000000000a0014002c01c8000000000009001301010050000000000000000000
967+0000000000000000000000000000000013001301000100000100500000000000
968+000000000000000000000000000000001c00130101005000f303000000000000
969+000000000000000000000000000000000108140103000000ef03000000000000
970+090000000000000000000000000000006e6574207469746c6500000016001401
971+010050000100500000000000000000000a0014002c01c8000000000009001401
972+0100500000000000000000000000000000000000000000000000000013001401
973+000100000100500000000000000000000000000000000000000000001c001401
974+01005000f3030000000000000000000000000000000000000000000001081501
975+03000000ef03000000000000090000000000000000000000000000006e657420
976+7469746c6500000016001501010050000100500000000000000000000a001400
977+2c01c80000000000090015010100500000000000000000000000000000000000
978+0000000000000000130015010001000001005000000000000000000000000000
979+00000000000000001c00150101005000f3030000000000000000000000000000
980+00000000000000000108160103000000ef030000000000000900000000000000
981+00000000000000006e6574207469746c65000000160016010100500001005000
982+00000000000000000a0014002c01c80000000000090016010100500000000000
983+0000000000000000000000000000000000000000130016010001000001005000
984+00000000000000000000000000000000000000001c00160101005000f3030000
985+00000000000000000000000000000000000000000108170103000000ef030000
986+00000000090000000000000000000000000000006e6574207469746c65000000
987+16001701010050000100500000000000000000000a0014002c01c80000000000
988+0900170101005000000000000000000000000000000000000000000000000000
989+1300170100010000010050000000000000000000000000000000000000000000
990+1c00170101005000f30300000000000000000000000000000000000000000000
991+0108180103000000ef0300000000000009000000000000000000000000000000
992+6e6574207469746c650000001600180101005000010050000000000000000000
993+0a0014002c01c800000000000900180101005000000000000000000000000000
994+0000000000000000000000001300180100010000010050000000000000000000
995+0000000000000000000000001c00180101005000f30300000000000000000000
996+0000000000000000000000000108190103000000ef0300000000000009000000
997+0000000000000000000000006e6574207469746c650000001600190101005000
998+0100500000000000000000000a0014002c01c800000000000900190101005000
999+0000000000000000000000000000000000000000000000001300190100010000
1000+0100500000000000000000000000000000000000000000001c00190101005000
1001+f3030000000000000000000000000000000000000000000001081a0103000000
1002+ef03000000000000090000000000000000000000000000006e6574207469746c
1003+6500000016001a01010050000100500000000000000000000a0014002c01c800
1004+0000000009001a01010050000000000000000000000000000000000000000000
1005+0000000013001a01000100000100500000000000000000000000000000000000
1006+000000001c001a0101005000f303000000000000000000000000000000000000
1007+0000000001081b0103000000ef03000000000000090000000000000000000000
1008+000000006e6574207469746c6500000016001b01010050000100500000000000
1009+000000000a0014002c01c8000000000009001b01010050000000000000000000
1010+0000000000000000000000000000000013001b01000100000100500000000000
1011+000000000000000000000000000000001c001b0101005000f303000000000000
1012+0000000000000000000000000000000001081c0103000000ef03000000000000
1013+090000000000000000000000000000006e6574207469746c6500000016001c01
1014+010050000100500000000000000000000a0014002c01c8000000000009001c01
1015+0100500000000000000000000000000000000000000000000000000013001c01
1016+000100000100500000000000000000000000000000000000000000001c001c01
1017+01005000f3030000000000000000000000000000000000000000000001081d01
1018+03000000ef03000000000000090000000000000000000000000000006e657420
1019+7469746c6500000016001d01010050000100500000000000000000000a001400
1020+2c01c8000000000009001d010100500000000000000000000000000000000000
1021+000000000000000013001d010001000001005000000000000000000000000000
1022+00000000000000001c001d0101005000f3030000000000000000000000000000
1023+000000000000000001081e0103000000ef030000000000000900000000000000
1024+00000000000000006e6574207469746c6500000016001e010100500001005000
1025+00000000000000000a0014002c01c8000000000009001e010100500000000000
1026+000000000000000000000000000000000000000013001e010001000001005000
1027+00000000000000000000000000000000000000001c001e0101005000f3030000
1028+000000000000000000000000000000000000000001081f0103000000ef030000
1029+00000000090000000000000000000000000000006e6574207469746c65000000
1030+16001f01010050000100500000000000000000000a0014002c01c80000000000
1031+09001f0101005000000000000000000000000000000000000000000000000000
1032+13001f0100010000010050000000000000000000000000000000000000000000
1033+1c001f0101005000f30300000000000000000000000000000000000000000000
1034+0108200103000000ef0300000000000009000000000000000000000000000000
1035+6e6574207469746c650000001600200101005000010050000000000000000000
1036+0a0014002c01c800000000000900200101005000000000000000000000000000
1037+0000000000000000000000001300200100010000010050000000000000000000
1038+0000000000000000000000001c00200101005000f30300000000000000000000
1039+0000000000000000000000000108210103000000ef0300000000000009000000
1040+0000000000000000000000006e6574207469746c650000001600210101005000
1041+0100500000000000000000000a0014002c01c800000000000900210101005000
1042+0000000000000000000000000000000000000000000000001300210100010000
1043+0100500000000000000000000000000000000000000000001c00210101005000
1044+f303000000000000000000000000000000000000000000000108220103000000
1045+ef03000000000000090000000000000000000000000000006e6574207469746c
1046+6500000016002201010050000100500000000000000000000a0014002c01c800
1047+0000000009002201010050000000000000000000000000000000000000000000
1048+0000000013002201000100000100500000000000000000000000000000000000
1049+000000001c00220101005000f303000000000000000000000000000000000000
1050+000000000108230103000000ef03000000000000090000000000000000000000
1051+000000006e6574207469746c6500000016002301010050000100500000000000
1052+000000000a0014002c01c8000000000009002301010050000000000000000000
1053+0000000000000000000000000000000013002301000100000100500000000000
1054+000000000000000000000000000000001c00230101005000f303000000000000
1055+000000000000000000000000000000000108240103000000ef03000000000000
1056+090000000000000000000000000000006e6574207469746c6500000016002401
1057+010050000100500000000000000000000a0014002c01c8000000000009002401
1058+0100500000000000000000000000000000000000000000000000000013002401
1059+000100000100500000000000000000000000000000000000000000001c002401
1060+01005000f3030000000000000000000000000000000000000000000001082501
1061+03000000ef03000000000000090000000000000000000000000000006e657420
1062+7469746c6500000016002501010050000100500000000000000000000a001400
1063+2c01c80000000000090025010100500000000000000000000000000000000000
1064+0000000000000000130025010001000001005000000000000000000000000000
1065+00000000000000001c00250101005000f3030000000000000000000000000000
1066+00000000000000000108260103000000ef030000000000000900000000000000
1067+00000000000000006e6574207469746c65000000160026010100500001005000
1068+00000000000000000a0014002c01c80000000000090026010100500000000000
1069+0000000000000000000000000000000000000000130026010001000001005000
1070+00000000000000000000000000000000000000001c00260101005000f3030000
1071+00000000000000000000000000000000000000000108270103000000ef030000
1072+00000000090000000000000000000000000000006e6574207469746c65000000
1073+16002701010050000100500000000000000000000a0014002c01c80000000000
1074+0900270101005000000000000000000000000000000000000000000000000000
1075+1300270100010000010050000000000000000000000000000000000000000000
1076+1c00270101005000f30300000000000000000000000000000000000000000000
1077+0108280103000000ef0300000000000009000000000000000000000000000000
1078+6e6574207469746c650000001600280101005000010050000000000000000000
1079+0a0014002c01c800000000000900280101005000000000000000000000000000
1080+0000000000000000000000001300280100010000010050000000000000000000
1081+0000000000000000000000001c00280101005000f30300000000000000000000
1082+0000000000000000000000000108290103000000ef0300000000000009000000
1083+0000000000000000000000006e6574207469746c650000001600290101005000
1084+0100500000000000000000000a0014002c01c800000000000900290101005000
1085+0000000000000000000000000000000000000000000000001300290100010000
1086+0100500000000000000000000000000000000000000000001c00290101005000
1087+f3030000000000000000000000000000000000000000000001082a0103000000
1088+ef03000000000000090000000000000000000000000000006e6574207469746c
1089+6500000016002a01010050000100500000000000000000000a0014002c01c800
1090+0000000009002a01010050000000000000000000000000000000000000000000
1091+0000000013002a01000100000100500000000000000000000000000000000000
1092+000000001c002a0101005000f303000000000000000000000000000000000000
1093+0000000001082b0103000000ef03000000000000090000000000000000000000
1094+000000006e6574207469746c6500000016002b01010050000100500000000000
1095+000000000a0014002c01c8000000000009002b01010050000000000000000000
1096+0000000000000000000000000000000013002b01000100000100500000000000
1097+000000000000000000000000000000001c002b0101005000f303000000000000
1098+0000000000000000000000000000000001082c0103000000ef03000000000000
1099+090000000000000000000000000000006e6574207469746c6500000016002c01
1100+010050000100500000000000000000000a0014002c01c8000000000009002c01
1101+0100500000000000000000000000000000000000000000000000000013002c01
1102+000100000100500000000000000000000000000000000000000000001c002c01
1103+01005000f3030000000000000000000000000000000000000000000001082d01
1104+03000000ef03000000000000090000000000000000000000000000006e657420
1105+7469746c6500000016002d01010050000100500000000000000000000a001400
1106+2c01c8000000000009002d010100500000000000000000000000000000000000
1107+000000000000000013002d010001000001005000000000000000000000000000
1108+00000000000000001c002d0101005000f3030000000000000000000000000000
1109+000000000000000001082e0103000000ef030000000000000900000000000000
1110+00000000000000006e6574207469746c6500000016002e010100500001005000
1111+00000000000000000a0014002c01c8000000000009002e010100500000000000
1112+000000000000000000000000000000000000000013002e010001000001005000
1113+00000000000000000000000000000000000000001c002e0101005000f3030000
1114+000000000000000000000000000000000000000001082f0103000000ef030000
1115+00000000090000000000000000000000000000006e6574207469746c65000000
1116+16002f01010050000100500000000000000000000a0014002c01c80000000000
1117+09002f0101005000000000000000000000000000000000000000000000000000
1118+13002f0100010000010050000000000000000000000000000000000000000000
1119+1c002f0101005000f30300000000000000000000000000000000000000000000
1120+0108300103000000ef0300000000000009000000000000000000000000000000
1121+6e6574207469746c650000001600300101005000010050000000000000000000
1122+0a0014002c01c800000000000900300101005000000000000000000000000000
1123+0000000000000000000000001300300100010000010050000000000000000000
1124+0000000000000000000000001c00300101005000f30300000000000000000000
1125+0000000000000000000000000108310103000000ef0300000000000009000000
1126+0000000000000000000000006e6574207469746c650000001600310101005000
1127+0100500000000000000000000a0014002c01c800000000000900310101005000
1128+0000000000000000000000000000000000000000000000001300310100010000
1129+0100500000000000000000000000000000000000000000001c00310101005000
1130+f303000000000000000000000000000000000000000000000108320103000000
1131+ef03000000000000090000000000000000000000000000006e6574207469746c
1132+6500000016003201010050000100500000000000000000000a0014002c01c800
1133+0000000009003201010050000000000000000000000000000000000000000000
1134+0000000013003201000100000100500000000000000000000000000000000000
1135+000000001c00320101005000f303000000000000000000000000000000000000
1136+000000000108330103000000ef03000000000000090000000000000000000000
1137+000000006e6574207469746c6500000016003301010050000100500000000000
1138+000000000a0014002c01c8000000000009003301010050000000000000000000
1139+0000000000000000000000000000000013003301000100000100500000000000
1140+000000000000000000000000000000001c00330101005000f303000000000000
1141+000000000000000000000000000000000108340103000000ef03000000000000
1142+090000000000000000000000000000006e6574207469746c6500000016003401
1143+010050000100500000000000000000000a0014002c01c8000000000009003401
1144+0100500000000000000000000000000000000000000000000000000013003401
1145+000100000100500000000000000000000000000000000000000000001c003401
1146+01005000f3030000000000000000000000000000000000000000000001083501
1147+03000000ef03000000000000090000000000000000000000000000006e657420
1148+7469746c6500000016003501010050000100500000000000000000000a001400
1149+2c01c80000000000090035010100500000000000000000000000000000000000
1150+0000000000000000130035010001000001005000000000000000000000000000
1151+00000000000000001c00350101005000f3030000000000000000000000000000
1152+00000000000000000108360103000000ef030000000000000900000000000000
1153+00000000000000006e6574207469746c65000000160036010100500001005000
1154+00000000000000000a0014002c01c80000000000090036010100500000000000
1155+0000000000000000000000000000000000000000130036010001000001005000
1156+00000000000000000000000000000000000000001c00360101005000f3030000
1157+00000000000000000000000000000000000000000108370103000000ef030000
1158+00000000090000000000000000000000000000006e6574207469746c65000000
1159+16003701010050000100500000000000000000000a0014002c01c80000000000
1160+0900370101005000000000000000000000000000000000000000000000000000
1161+1300370100010000010050000000000000000000000000000000000000000000
1162+1c00370101005000f30300000000000000000000000000000000000000000000
1163+0108380103000000ef0300000000000009000000000000000000000000000000
1164+6e6574207469746c650000001600380101005000010050000000000000000000
1165+0a0014002c01c800000000000900380101005000000000000000000000000000
1166+0000000000000000000000001300380100010000010050000000000000000000
1167+0000000000000000000000001c00380101005000f30300000000000000000000
1168+0000000000000000000000000108390103000000ef0300000000000009000000
1169+0000000000000000000000006e6574207469746c650000001600390101005000
1170+0100500000000000000000000a0014002c01c800000000000900390101005000
1171+0000000000000000000000000000000000000000000000001300390100010000
1172+0100500000000000000000000000000000000000000000001c00390101005000
1173+f3030000000000000000000000000000000000000000000001083a0103000000
1174+ef03000000000000090000000000000000000000000000006e6574207469746c
1175+6500000016003a01010050000100500000000000000000000a0014002c01c800
1176+0000000009003a01010050000000000000000000000000000000000000000000
1177+0000000013003a01000100000100500000000000000000000000000000000000
1178+000000001c003a0101005000f303000000000000000000000000000000000000
1179+0000000001083b0103000000ef03000000000000090000000000000000000000
1180+000000006e6574207469746c6500000016003b01010050000100500000000000
1181+000000000a0014002c01c8000000000009003b01010050000000000000000000
1182+0000000000000000000000000000000013003b01000100000100500000000000
1183+000000000000000000000000000000001c003b0101005000f303000000000000
1184+0000000000000000000000000000000001083c0103000000ef03000000000000
1185+090000000000000000000000000000006e6574207469746c6500000016003c01
1186+010050000100500000000000000000000a0014002c01c8000000000009003c01
1187+0100500000000000000000000000000000000000000000000000000013003c01
1188+000100000100500000000000000000000000000000000000000000001c003c01
1189+01005000f3030000000000000000000000000000000000000000000001083d01
1190+03000000ef03000000000000090000000000000000000000000000006e657420
1191+7469746c6500000016003d01010050000100500000000000000000000a001400
1192+2c01c8000000000009003d010100500000000000000000000000000000000000
1193+000000000000000013003d010001000001005000000000000000000000000000
1194+00000000000000001c003d0101005000f3030000000000000000000000000000
1195+000000000000000001083e0103000000ef030000000000000900000000000000
1196+00000000000000006e6574207469746c6500000016003e010100500001005000
1197+00000000000000000a0014002c01c8000000000009003e010100500000000000
1198+000000000000000000000000000000000000000013003e010001000001005000
1199+00000000000000000000000000000000000000001c003e0101005000f3030000
1200+000000000000000000000000000000000000000001083f0103000000ef030000
1201+00000000090000000000000000000000000000006e6574207469746c65000000
1202+16003f01010050000100500000000000000000000a0014002c01c80000000000
1203+09003f0101005000000000000000000000000000000000000000000000000000
1204+13003f0100010000010050000000000000000000000000000000000000000000
1205+1c003f0101005000f30300000000000000000000000000000000000000000000
1206+0108400103000000ef0300000000000009000000000000000000000000000000
1207+6e6574207469746c650000001600400101005000010050000000000000000000
1208+0a0014002c01c800000000000900400101005000000000000000000000000000
1209+0000000000000000000000001300400100010000010050000000000000000000
1210+0000000000000000000000001c00400101005000f30300000000000000000000
1211+0000000000000000000000000108410103000000ef0300000000000009000000
1212+0000000000000000000000006e6574207469746c650000001600410101005000
1213+0100500000000000000000000a0014002c01c800000000000900410101005000
1214+0000000000000000000000000000000000000000000000001300410100010000
1215+0100500000000000000000000000000000000000000000001c00410101005000
1216+f303000000000000000000000000000000000000000000000108420103000000
1217+ef03000000000000090000000000000000000000000000006e6574207469746c
1218+6500000016004201010050000100500000000000000000000a0014002c01c800
1219+0000000009004201010050000000000000000000000000000000000000000000
1220+0000000013004201000100000100500000000000000000000000000000000000
1221+000000001c00420101005000f303000000000000000000000000000000000000
1222+000000000108430103000000ef03000000000000090000000000000000000000
1223+000000006e6574207469746c6500000016004301010050000100500000000000
1224+000000000a0014002c01c8000000000009004301010050000000000000000000
1225+0000000000000000000000000000000013004301000100000100500000000000
1226+000000000000000000000000000000001c00430101005000f303000000000000
1227+000000000000000000000000000000000108440103000000ef03000000000000
1228+090000000000000000000000000000006e6574207469746c6500000016004401
1229+010050000100500000000000000000000a0014002c01c8000000000009004401
1230+0100500000000000000000000000000000000000000000000000000013004401
1231+000100000100500000000000000000000000000000000000000000001c004401
1232+01005000f3030000000000000000000000000000000000000000000001084501
1233+03000000ef03000000000000090000000000000000000000000000006e657420
1234+7469746c6500000016004501010050000100500000000000000000000a001400
1235+2c01c80000000000090045010100500000000000000000000000000000000000
1236+0000000000000000130045010001000001005000000000000000000000000000
1237+00000000000000001c00450101005000f3030000000000000000000000000000
1238+00000000000000000108460103000000ef030000000000000900000000000000
1239+00000000000000006e6574207469746c65000000160046010100500001005000
1240+00000000000000000a0014002c01c80000000000090046010100500000000000
1241+0000000000000000000000000000000000000000130046010001000001005000
1242+00000000000000000000000000000000000000001c00460101005000f3030000
1243+00000000000000000000000000000000000000000108470103000000ef030000
1244+00000000090000000000000000000000000000006e6574207469746c65000000
1245+16004701010050000100500000000000000000000a0014002c01c80000000000
1246+0900470101005000000000000000000000000000000000000000000000000000
1247+1300470100010000010050000000000000000000000000000000000000000000
1248+1c00470101005000f30300000000000000000000000000000000000000000000
1249+0108480103000000ef0300000000000009000000000000000000000000000000
1250+6e6574207469746c650000001600480101005000010050000000000000000000
1251+0a0014002c01c800000000000900480101005000000000000000000000000000
1252+0000000000000000000000001300480100010000010050000000000000000000
1253+0000000000000000000000001c00480101005000f30300000000000000000000
1254+0000000000000000000000000108490103000000ef0300000000000009000000
1255+0000000000000000000000006e6574207469746c650000001600490101005000
1256+0100500000000000000000000a0014002c01c800000000000900490101005000
1257+0000000000000000000000000000000000000000000000001300490100010000
1258+0100500000000000000000000000000000000000000000001c00490101005000
1259+f3030000000000000000000000000000000000000000000001084a0103000000
1260+ef03000000000000090000000000000000000000000000006e6574207469746c
1261+6500000016004a01010050000100500000000000000000000a0014002c01c800
1262+0000000009004a01010050000000000000000000000000000000000000000000
1263+0000000013004a01000100000100500000000000000000000000000000000000
1264+000000001c004a0101005000f303000000000000000000000000000000000000
1265+0000000001084b0103000000ef03000000000000090000000000000000000000
1266+000000006e6574207469746c6500000016004b01010050000100500000000000
1267+000000000a0014002c01c8000000000009004b01010050000000000000000000
1268+0000000000000000000000000000000013004b01000100000100500000000000
1269+000000000000000000000000000000001c004b0101005000f303000000000000
1270+0000000000000000000000000000000001084c0103000000ef03000000000000
1271+090000000000000000000000000000006e6574207469746c6500000016004c01
1272+010050000100500000000000000000000a0014002c01c8000000000009004c01
1273+0100500000000000000000000000000000000000000000000000000013004c01
1274+000100000100500000000000000000000000000000000000000000001c004c01
1275+01005000f3030000000000000000000000000000000000000000000001084d01
1276+03000000ef03000000000000090000000000000000000000000000006e657420
1277+7469746c6500000016004d01010050000100500000000000000000000a001400
1278+2c01c8000000000009004d010100500000000000000000000000000000000000
1279+000000000000000013004d010001000001005000000000000000000000000000
1280+00000000000000001c004d0101005000f3030000000000000000000000000000
1281+000000000000000001084e0103000000ef030000000000000900000000000000
1282+00000000000000006e6574207469746c6500000016004e010100500001005000
1283+00000000000000000a0014002c01c8000000000009004e010100500000000000
1284+000000000000000000000000000000000000000013004e010001000001005000
1285+00000000000000000000000000000000000000001c004e0101005000f3030000
1286+000000000000000000000000000000000000000001084f0103000000ef030000
1287+00000000090000000000000000000000000000006e6574207469746c65000000
1288+16004f01010050000100500000000000000000000a0014002c01c80000000000
1289+09004f0101005000000000000000000000000000000000000000000000000000
1290+13004f0100010000010050000000000000000000000000000000000000000000
1291+1c004f0101005000f30300000000000000000000000000000000000000000000
1292+0108500103000000ef0300000000000009000000000000000000000000000000
1293+6e6574207469746c650000001600500101005000010050000000000000000000
1294+0a0014002c01c800000000000900500101005000000000000000000000000000
1295+0000000000000000000000001300500100010000010050000000000000000000
1296+0000000000000000000000001c00500101005000f30300000000000000000000
1297+0000000000000000000000000108510103000000ef0300000000000009000000
1298+0000000000000000000000006e6574207469746c650000001600510101005000
1299+0100500000000000000000000a0014002c01c800000000000900510101005000
1300+0000000000000000000000000000000000000000000000001300510100010000
1301+0100500000000000000000000000000000000000000000001c00510101005000
1302+f303000000000000000000000000000000000000000000000108520103000000
1303+ef03000000000000090000000000000000000000000000006e6574207469746c
1304+6500000016005201010050000100500000000000000000000a0014002c01c800
1305+0000000009005201010050000000000000000000000000000000000000000000
1306+0000000013005201000100000100500000000000000000000000000000000000
1307+000000001c00520101005000f303000000000000000000000000000000000000
1308+000000000108530103000000ef03000000000000090000000000000000000000
1309+000000006e6574207469746c6500000016005301010050000100500000000000
1310+000000000a0014002c01c8000000000009005301010050000000000000000000
1311+0000000000000000000000000000000013005301000100000100500000000000
1312+000000000000000000000000000000001c00530101005000f303000000000000
1313+000000000000000000000000000000000108540103000000ef03000000000000
1314+090000000000000000000000000000006e6574207469746c6500000016005401
1315+010050000100500000000000000000000a0014002c01c8000000000009005401
1316+0100500000000000000000000000000000000000000000000000000013005401
1317+000100000100500000000000000000000000000000000000000000001c005401
1318+01005000f3030000000000000000000000000000000000000000000001085501
1319+03000000ef03000000000000090000000000000000000000000000006e657420
1320+7469746c6500000016005501010050000100500000000000000000000a001400
1321+2c01c80000000000090055010100500000000000000000000000000000000000
1322+0000000000000000130055010001000001005000000000000000000000000000
1323+00000000000000001c00550101005000f3030000000000000000000000000000
1324+00000000000000000108560103000000ef030000000000000900000000000000
1325+00000000000000006e6574207469746c65000000160056010100500001005000
1326+00000000000000000a0014002c01c80000000000090056010100500000000000
1327+0000000000000000000000000000000000000000130056010001000001005000
1328+00000000000000000000000000000000000000001c00560101005000f3030000
1329+00000000000000000000000000000000000000000108570103000000ef030000
1330+00000000090000000000000000000000000000006e6574207469746c65000000
1331+16005701010050000100500000000000000000000a0014002c01c80000000000
1332+0900570101005000000000000000000000000000000000000000000000000000
1333+1300570100010000010050000000000000000000000000000000000000000000
1334+1c00570101005000f30300000000000000000000000000000000000000000000
1335+0108580103000000ef0300000000000009000000000000000000000000000000
1336+6e6574207469746c650000001600580101005000010050000000000000000000
1337+0a0014002c01c800000000000900580101005000000000000000000000000000
1338+0000000000000000000000001300580100010000010050000000000000000000
1339+0000000000000000000000001c00580101005000f30300000000000000000000
1340+0000000000000000000000000108590103000000ef0300000000000009000000
1341+0000000000000000000000006e6574207469746c650000001600590101005000
1342+0100500000000000000000000a0014002c01c800000000000900590101005000
1343+0000000000000000000000000000000000000000000000001300590100010000
1344+0100500000000000000000000000000000000000000000001c00590101005000
1345+f3030000000000000000000000000000000000000000000001085a0103000000
1346+ef03000000000000090000000000000000000000000000006e6574207469746c
1347+6500000016005a01010050000100500000000000000000000a0014002c01c800
1348+0000000009005a01010050000000000000000000000000000000000000000000
1349+0000000013005a01000100000100500000000000000000000000000000000000
1350+000000001c005a0101005000f303000000000000000000000000000000000000
1351+0000000001085b0103000000ef03000000000000090000000000000000000000
1352+000000006e6574207469746c6500000016005b01010050000100500000000000
1353+000000000a0014002c01c8000000000009005b01010050000000000000000000
1354+0000000000000000000000000000000013005b01000100000100500000000000
1355+000000000000000000000000000000001c005b0101005000f303000000000000
1356+0000000000000000000000000000000001085c0103000000ef03000000000000
1357+090000000000000000000000000000006e6574207469746c6500000016005c01
1358+010050000100500000000000000000000a0014002c01c8000000000009005c01
1359+0100500000000000000000000000000000000000000000000000000013005c01
1360+000100000100500000000000000000000000000000000000000000001c005c01
1361+01005000f3030000000000000000000000000000000000000000000001085d01
1362+03000000ef03000000000000090000000000000000000000000000006e657420
1363+7469746c6500000016005d01010050000100500000000000000000000a001400
1364+2c01c8000000000009005d010100500000000000000000000000000000000000
1365+000000000000000013005d010001000001005000000000000000000000000000
1366+00000000000000001c005d0101005000f3030000000000000000000000000000
1367+000000000000000001085e0103000000ef030000000000000900000000000000
1368+00000000000000006e6574207469746c6500000016005e010100500001005000
1369+00000000000000000a0014002c01c8000000000009005e010100500000000000
1370+000000000000000000000000000000000000000013005e010001000001005000
1371+00000000000000000000000000000000000000001c005e0101005000f3030000
1372+000000000000000000000000000000000000000001085f0103000000ef030000
1373+00000000090000000000000000000000000000006e6574207469746c65000000
1374+16005f01010050000100500000000000000000000a0014002c01c80000000000
1375+09005f0101005000000000000000000000000000000000000000000000000000
1376+13005f0100010000010050000000000000000000000000000000000000000000
1377+1c005f0101005000f30300000000000000000000000000000000000000000000
1378+0108600103000000ef0300000000000009000000000000000000000000000000
1379+6e6574207469746c650000001600600101005000010050000000000000000000
1380+0a0014002c01c800000000000900600101005000000000000000000000000000
1381+0000000000000000000000001300600100010000010050000000000000000000
1382+0000000000000000000000001c00600101005000f30300000000000000000000
1383+0000000000000000000000000108610103000000ef0300000000000009000000
1384+0000000000000000000000006e6574207469746c650000001600610101005000
1385+0100500000000000000000000a0014002c01c800000000000900610101005000
1386+0000000000000000000000000000000000000000000000001300610100010000
1387+0100500000000000000000000000000000000000000000001c00610101005000
1388+f303000000000000000000000000000000000000000000000108620103000000
1389+ef03000000000000090000000000000000000000000000006e6574207469746c
1390+6500000016006201010050000100500000000000000000000a0014002c01c800
1391+0000000009006201010050000000000000000000000000000000000000000000
1392+0000000013006201000100000100500000000000000000000000000000000000
1393+000000001c00620101005000f303000000000000000000000000000000000000
1394+000000000108630103000000ef03000000000000090000000000000000000000
1395+000000006e6574207469746c6500000016006301010050000100500000000000
1396+000000000a0014002c01c8000000000009006301010050000000000000000000
1397+0000000000000000000000000000000013006301000100000100500000000000
1398+000000000000000000000000000000001c00630101005000f303000000000000
1399+000000000000000000000000000000000108640103000000ef03000000000000
1400+090000000000000000000000000000006e6574207469746c6500000016006401
1401+010050000100500000000000000000000a0014002c01c8000000000009006401
1402+0100500000000000000000000000000000000000000000000000000013006401
1403+000100000100500000000000000000000000000000000000000000001c006401
1404+01005000f3030000000000000000000000000000000000000000000001086501
1405+03000000ef03000000000000090000000000000000000000000000006e657420
1406+7469746c6500000016006501010050000100500000000000000000000a001400
1407+2c01c80000000000090065010100500000000000000000000000000000000000
1408+0000000000000000130065010001000001005000000000000000000000000000
1409+00000000000000001c00650101005000f3030000000000000000000000000000
1410+00000000000000000108660103000000ef030000000000000900000000000000
1411+00000000000000006e6574207469746c65000000160066010100500001005000
1412+00000000000000000a0014002c01c80000000000090066010100500000000000
1413+0000000000000000000000000000000000000000130066010001000001005000
1414+00000000000000000000000000000000000000001c00660101005000f3030000
1415+00000000000000000000000000000000000000000108670103000000ef030000
1416+00000000090000000000000000000000000000006e6574207469746c65000000
1417+16006701010050000100500000000000000000000a0014002c01c80000000000
1418+0900670101005000000000000000000000000000000000000000000000000000
1419+1300670100010000010050000000000000000000000000000000000000000000
1420+1c00670101005000f30300000000000000000000000000000000000000000000
1421+0108680103000000ef0300000000000009000000000000000000000000000000
1422+6e6574207469746c650000001600680101005000010050000000000000000000
1423+0a0014002c01c800000000000900680101005000000000000000000000000000
1424+0000000000000000000000001300680100010000010050000000000000000000
1425+0000000000000000000000001c00680101005000f30300000000000000000000
1426+0000000000000000000000000108690103000000ef0300000000000009000000
1427+0000000000000000000000006e6574207469746c650000001600690101005000
1428+0100500000000000000000000a0014002c01c800000000000900690101005000
1429+0000000000000000000000000000000000000000000000001300690100010000
1430+0100500000000000000000000000000000000000000000001c00690101005000
1431+f3030000000000000000000000000000000000000000000001086a0103000000
1432+ef03000000000000090000000000000000000000000000006e6574207469746c
1433+6500000016006a01010050000100500000000000000000000a0014002c01c800
1434+0000000009006a01010050000000000000000000000000000000000000000000
1435+0000000013006a01000100000100500000000000000000000000000000000000
1436+000000001c006a0101005000f303000000000000000000000000000000000000
1437+0000000001086b0103000000ef03000000000000090000000000000000000000
1438+000000006e6574207469746c6500000016006b01010050000100500000000000
1439+000000000a0014002c01c8000000000009006b01010050000000000000000000
1440+0000000000000000000000000000000013006b01000100000100500000000000
1441+000000000000000000000000000000001c006b0101005000f303000000000000
1442+0000000000000000000000000000000001086c0103000000ef03000000000000
1443+090000000000000000000000000000006e6574207469746c6500000016006c01
1444+010050000100500000000000000000000a0014002c01c8000000000009006c01
1445+0100500000000000000000000000000000000000000000000000000013006c01
1446+000100000100500000000000000000000000000000000000000000001c006c01
1447+01005000f3030000000000000000000000000000000000000000000001086d01
1448+03000000ef03000000000000090000000000000000000000000000006e657420
1449+7469746c6500000016006d01010050000100500000000000000000000a001400
1450+2c01c8000000000009006d010100500000000000000000000000000000000000
1451+000000000000000013006d010001000001005000000000000000000000000000
1452+00000000000000001c006d0101005000f3030000000000000000000000000000
1453+000000000000000001086e0103000000ef030000000000000900000000000000
1454+00000000000000006e6574207469746c6500000016006e010100500001005000
1455+00000000000000000a0014002c01c8000000000009006e010100500000000000
1456+000000000000000000000000000000000000000013006e010001000001005000
1457+00000000000000000000000000000000000000001c006e0101005000f3030000
1458+000000000000000000000000000000000000000001086f0103000000ef030000
1459+00000000090000000000000000000000000000006e6574207469746c65000000
1460+16006f01010050000100500000000000000000000a0014002c01c80000000000
1461+09006f0101005000000000000000000000000000000000000000000000000000
1462+13006f0100010000010050000000000000000000000000000000000000000000
1463+1c006f0101005000f30300000000000000000000000000000000000000000000
1464+0108700103000000ef0300000000000009000000000000000000000000000000
1465+6e6574207469746c650000001600700101005000010050000000000000000000
1466+0a0014002c01c800000000000900700101005000000000000000000000000000
1467+0000000000000000000000001300700100010000010050000000000000000000
1468+0000000000000000000000001c00700101005000f30300000000000000000000
1469+0000000000000000000000000108710103000000ef0300000000000009000000
1470+0000000000000000000000006e6574207469746c650000001600710101005000
1471+0100500000000000000000000a0014002c01c800000000000900710101005000
1472+0000000000000000000000000000000000000000000000001300710100010000
1473+0100500000000000000000000000000000000000000000001c00710101005000
1474+f303000000000000000000000000000000000000000000000108720103000000
1475+ef03000000000000090000000000000000000000000000006e6574207469746c
1476+6500000016007201010050000100500000000000000000000a0014002c01c800
1477+0000000009007201010050000000000000000000000000000000000000000000
1478+0000000013007201000100000100500000000000000000000000000000000000
1479+000000001c00720101005000f303000000000000000000000000000000000000
1480+000000000108730103000000ef03000000000000090000000000000000000000
1481+000000006e6574207469746c6500000016007301010050000100500000000000
1482+000000000a0014002c01c8000000000009007301010050000000000000000000
1483+0000000000000000000000000000000013007301000100000100500000000000
1484+000000000000000000000000000000001c00730101005000f303000000000000
1485+000000000000000000000000000000000108740103000000ef03000000000000
1486+090000000000000000000000000000006e6574207469746c6500000016007401
1487+010050000100500000000000000000000a0014002c01c8000000000009007401
1488+0100500000000000000000000000000000000000000000000000000013007401
1489+000100000100500000000000000000000000000000000000000000001c007401
1490+01005000f3030000000000000000000000000000000000000000000001087501
1491+03000000ef03000000000000090000000000000000000000000000006e657420
1492+7469746c6500000016007501010050000100500000000000000000000a001400
1493+2c01c80000000000090075010100500000000000000000000000000000000000
1494+0000000000000000130075010001000001005000000000000000000000000000
1495+00000000000000001c00750101005000f3030000000000000000000000000000
1496+00000000000000000108760103000000ef030000000000000900000000000000
1497+00000000000000006e6574207469746c65000000160076010100500001005000
1498+00000000000000000a0014002c01c80000000000090076010100500000000000
1499+0000000000000000000000000000000000000000130076010001000001005000
1500+00000000000000000000000000000000000000001c00760101005000f3030000
1501+00000000000000000000000000000000000000000108770103000000ef030000
1502+00000000090000000000000000000000000000006e6574207469746c65000000
1503+16007701010050000100500000000000000000000a0014002c01c80000000000
1504+0900770101005000000000000000000000000000000000000000000000000000
1505+1300770100010000010050000000000000000000000000000000000000000000
1506+1c00770101005000f30300000000000000000000000000000000000000000000
1507+0108780103000000ef0300000000000009000000000000000000000000000000
1508+6e6574207469746c650000001600780101005000010050000000000000000000
1509+0a0014002c01c800000000000900780101005000000000000000000000000000
1510+0000000000000000000000001300780100010000010050000000000000000000
1511+0000000000000000000000001c00780101005000f30300000000000000000000
1512+0000000000000000000000000108790103000000ef0300000000000009000000
1513+0000000000000000000000006e6574207469746c650000001600790101005000
1514+0100500000000000000000000a0014002c01c800000000000900790101005000
1515+0000000000000000000000000000000000000000000000001300790100010000
1516+0100500000000000000000000000000000000000000000001c00790101005000
1517+f3030000000000000000000000000000000000000000000001087a0103000000
1518+ef03000000000000090000000000000000000000000000006e6574207469746c
1519+6500000016007a01010050000100500000000000000000000a0014002c01c800
1520+0000000009007a01010050000000000000000000000000000000000000000000
1521+0000000013007a01000100000100500000000000000000000000000000000000
1522+000000001c007a0101005000f303000000000000000000000000000000000000
1523+0000000001087b0103000000ef03000000000000090000000000000000000000
1524+000000006e6574207469746c6500000016007b01010050000100500000000000
1525+000000000a0014002c01c8000000000009007b01010050000000000000000000
1526+0000000000000000000000000000000013007b01000100000100500000000000
1527+000000000000000000000000000000001c007b0101005000f303000000000000
1528+0000000000000000000000000000000001087c0103000000ef03000000000000
1529+090000000000000000000000000000006e6574207469746c6500000016007c01
1530+010050000100500000000000000000000a0014002c01c8000000000009007c01
1531+0100500000000000000000000000000000000000000000000000000013007c01
1532+000100000100500000000000000000000000000000000000000000001c007c01
1533+01005000f3030000000000000000000000000000000000000000000001087d01
1534+03000000ef03000000000000090000000000000000000000000000006e657420
1535+7469746c6500000016007d01010050000100500000000000000000000a001400
1536+2c01c8000000000009007d010100500000000000000000000000000000000000
1537+000000000000000013007d010001000001005000000000000000000000000000
1538+00000000000000001c007d0101005000f3030000000000000000000000000000
1539+000000000000000001087e0103000000ef030000000000000900000000000000
1540+00000000000000006e6574207469746c6500000016007e010100500001005000
1541+00000000000000000a0014002c01c8000000000009007e010100500000000000
1542+000000000000000000000000000000000000000013007e010001000001005000
1543+00000000000000000000000000000000000000001c007e0101005000f3030000
1544+000000000000000000000000000000000000000001087f0103000000ef030000
1545+00000000090000000000000000000000000000006e6574207469746c65000000
1546+16007f01010050000100500000000000000000000a0014002c01c80000000000
1547+09007f0101005000000000000000000000000000000000000000000000000000
1548+13007f0100010000010050000000000000000000000000000000000000000000
1549+1c007f0101005000f30300000000000000000000000000000000000000000000
1550+0108800103000000ef0300000000000009000000000000000000000000000000
1551+6e6574207469746c650000001600800101005000010050000000000000000000
1552+0a0014002c01c800000000000900800101005000000000000000000000000000
1553+0000000000000000000000001300800100010000010050000000000000000000
1554+0000000000000000000000001c00800101005000f30300000000000000000000
1555+0000000000000000000000000108810103000000ef0300000000000009000000
1556+0000000000000000000000006e6574207469746c650000001600810101005000
1557+0100500000000000000000000a0014002c01c800000000000900810101005000
1558+0000000000000000000000000000000000000000000000001300810100010000
1559+0100500000000000000000000000000000000000000000001c00810101005000
1560+f303000000000000000000000000000000000000000000000108820103000000
1561+ef03000000000000090000000000000000000000000000006e6574207469746c
1562+6500000016008201010050000100500000000000000000000a0014002c01c800
1563+0000000009008201010050000000000000000000000000000000000000000000
1564+0000000013008201000100000100500000000000000000000000000000000000
1565+000000001c00820101005000f303000000000000000000000000000000000000
1566+000000000108830103000000ef03000000000000090000000000000000000000
1567+000000006e6574207469746c6500000016008301010050000100500000000000
1568+000000000a0014002c01c8000000000009008301010050000000000000000000
1569+0000000000000000000000000000000013008301000100000100500000000000
1570+000000000000000000000000000000001c00830101005000f303000000000000
1571+000000000000000000000000000000000108840103000000ef03000000000000
1572+090000000000000000000000000000006e6574207469746c6500000016008401
1573+010050000100500000000000000000000a0014002c01c8000000000009008401
1574+0100500000000000000000000000000000000000000000000000000013008401
1575+000100000100500000000000000000000000000000000000000000001c008401
1576+01005000f3030000000000000000000000000000000000000000000001088501
1577+03000000ef03000000000000090000000000000000000000000000006e657420
1578+7469746c6500000016008501010050000100500000000000000000000a001400
1579+2c01c80000000000090085010100500000000000000000000000000000000000
1580+0000000000000000130085010001000001005000000000000000000000000000
1581+00000000000000001c00850101005000f3030000000000000000000000000000
1582+00000000000000000108860103000000ef030000000000000900000000000000
1583+00000000000000006e6574207469746c65000000160086010100500001005000
1584+00000000000000000a0014002c01c80000000000090086010100500000000000
1585+0000000000000000000000000000000000000000130086010001000001005000
1586+00000000000000000000000000000000000000001c00860101005000f3030000
1587+00000000000000000000000000000000000000000108870103000000ef030000
1588+00000000090000000000000000000000000000006e6574207469746c65000000
1589+16008701010050000100500000000000000000000a0014002c01c80000000000
1590+0900870101005000000000000000000000000000000000000000000000000000
1591+1300870100010000010050000000000000000000000000000000000000000000
1592+1c00870101005000f30300000000000000000000000000000000000000000000
1593+0108880103000000ef0300000000000009000000000000000000000000000000
1594+6e6574207469746c650000001600880101005000010050000000000000000000
1595+0a0014002c01c800000000000900880101005000000000000000000000000000
1596+0000000000000000000000001300880100010000010050000000000000000000
1597+0000000000000000000000001c00880101005000f30300000000000000000000
1598+0000000000000000000000000108890103000000ef0300000000000009000000
1599+0000000000000000000000006e6574207469746c650000001600890101005000
1600+0100500000000000000000000a0014002c01c800000000000900890101005000
1601+0000000000000000000000000000000000000000000000001300890100010000
1602+0100500000000000000000000000000000000000000000001c00890101005000
1603+f3030000000000000000000000000000000000000000000001088a0103000000
1604+ef03000000000000090000000000000000000000000000006e6574207469746c
1605+6500000016008a01010050000100500000000000000000000a0014002c01c800
1606+0000000009008a01010050000000000000000000000000000000000000000000
1607+0000000013008a01000100000100500000000000000000000000000000000000
1608+000000001c008a0101005000f303000000000000000000000000000000000000
1609+0000000001088b0103000000ef03000000000000090000000000000000000000
1610+000000006e6574207469746c6500000016008b01010050000100500000000000
1611+000000000a0014002c01c8000000000009008b01010050000000000000000000
1612+0000000000000000000000000000000013008b01000100000100500000000000
1613+000000000000000000000000000000001c008b0101005000f303000000000000
1614+0000000000000000000000000000000001088c0103000000ef03000000000000
1615+090000000000000000000000000000006e6574207469746c6500000016008c01
1616+010050000100500000000000000000000a0014002c01c8000000000009008c01
1617+0100500000000000000000000000000000000000000000000000000013008c01
1618+000100000100500000000000000000000000000000000000000000001c008c01
1619+01005000f3030000000000000000000000000000000000000000000001088d01
1620+03000000ef03000000000000090000000000000000000000000000006e657420
1621+7469746c6500000016008d01010050000100500000000000000000000a001400
1622+2c01c8000000000009008d010100500000000000000000000000000000000000
1623+000000000000000013008d010001000001005000000000000000000000000000
1624+00000000000000001c008d0101005000f3030000000000000000000000000000
1625+000000000000000001088e0103000000ef030000000000000900000000000000
1626+00000000000000006e6574207469746c6500000016008e010100500001005000
1627+00000000000000000a0014002c01c8000000000009008e010100500000000000
1628+000000000000000000000000000000000000000013008e010001000001005000
1629+00000000000000000000000000000000000000001c008e0101005000f3030000
1630+000000000000000000000000000000000000000001088f0103000000ef030000
1631+00000000090000000000000000000000000000006e6574207469746c65000000
1632+16008f01010050000100500000000000000000000a0014002c01c80000000000
1633+09008f0101005000000000000000000000000000000000000000000000000000
1634+13008f0100010000010050000000000000000000000000000000000000000000
1635+1c008f0101005000f30300000000000000000000000000000000000000000000
1636+0108900103000000ef0300000000000009000000000000000000000000000000
1637+6e6574207469746c650000001600900101005000010050000000000000000000
1638+0a0014002c01c800000000000900900101005000000000000000000000000000
1639+0000000000000000000000001300900100010000010050000000000000000000
1640+0000000000000000000000001c00900101005000f30300000000000000000000
1641+0000000000000000000000000108910103000000ef0300000000000009000000
1642+0000000000000000000000006e6574207469746c650000001600910101005000
1643+0100500000000000000000000a0014002c01c800000000000900910101005000
1644+0000000000000000000000000000000000000000000000001300910100010000
1645+0100500000000000000000000000000000000000000000001c00910101005000
1646+f303000000000000000000000000000000000000000000000108920103000000
1647+ef03000000000000090000000000000000000000000000006e6574207469746c
1648+6500000016009201010050000100500000000000000000000a0014002c01c800
1649+0000000009009201010050000000000000000000000000000000000000000000
1650+0000000013009201000100000100500000000000000000000000000000000000
1651+000000001c00920101005000f303000000000000000000000000000000000000
1652+000000000108930103000000ef03000000000000090000000000000000000000
1653+000000006e6574207469746c6500000016009301010050000100500000000000
1654+000000000a0014002c01c8000000000009009301010050000000000000000000
1655+0000000000000000000000000000000013009301000100000100500000000000
1656+000000000000000000000000000000001c00930101005000f303000000000000
1657+000000000000000000000000000000000108940103000000ef03000000000000
1658+090000000000000000000000000000006e6574207469746c6500000016009401
1659+010050000100500000000000000000000a0014002c01c8000000000009009401
1660+0100500000000000000000000000000000000000000000000000000013009401
1661+000100000100500000000000000000000000000000000000000000001c009401
1662+01005000f3030000000000000000000000000000000000000000000001089501
1663+03000000ef03000000000000090000000000000000000000000000006e657420
1664+7469746c6500000016009501010050000100500000000000000000000a001400
1665+2c01c80000000000090095010100500000000000000000000000000000000000
1666+0000000000000000130095010001000001005000000000000000000000000000
1667+00000000000000001c00950101005000f3030000000000000000000000000000
1668+00000000000000000108960103000000ef030000000000000900000000000000
1669+00000000000000006e6574207469746c65000000160096010100500001005000
1670+00000000000000000a0014002c01c80000000000090096010100500000000000
1671+0000000000000000000000000000000000000000130096010001000001005000
1672+00000000000000000000000000000000000000001c00960101005000f3030000
1673+00000000000000000000000000000000000000000108970103000000ef030000
1674+00000000090000000000000000000000000000006e6574207469746c65000000
1675+16009701010050000100500000000000000000000a0014002c01c80000000000
1676+0900970101005000000000000000000000000000000000000000000000000000
1677+1300970100010000010050000000000000000000000000000000000000000000
1678+1c00970101005000f30300000000000000000000000000000000000000000000
1679+0108980103000000ef0300000000000009000000000000000000000000000000
1680+6e6574207469746c650000001600980101005000010050000000000000000000
1681+0a0014002c01c800000000000900980101005000000000000000000000000000
1682+0000000000000000000000001300980100010000010050000000000000000000
1683+0000000000000000000000001c00980101005000f30300000000000000000000
1684+0000000000000000000000000108990103000000ef0300000000000009000000
1685+0000000000000000000000006e6574207469746c650000001600990101005000
1686+0100500000000000000000000a0014002c01c800000000000900990101005000
1687+0000000000000000000000000000000000000000000000001300990100010000
1688+0100500000000000000000000000000000000000000000001c00990101005000
1689+f3030000000000000000000000000000000000000000000001089a0103000000
1690+ef03000000000000090000000000000000000000000000006e6574207469746c
1691+6500000016009a01010050000100500000000000000000000a0014002c01c800
1692+0000000009009a01010050000000000000000000000000000000000000000000
1693+0000000013009a01000100000100500000000000000000000000000000000000
1694+000000001c009a0101005000f303000000000000000000000000000000000000
1695+0000000001089b0103000000ef03000000000000090000000000000000000000
1696+000000006e6574207469746c6500000016009b01010050000100500000000000
1697+000000000a0014002c01c8000000000009009b01010050000000000000000000
1698+0000000000000000000000000000000013009b01000100000100500000000000
1699+000000000000000000000000000000001c009b0101005000f303000000000000
1700+0000000000000000000000000000000001089c0103000000ef03000000000000
1701+090000000000000000000000000000006e6574207469746c6500000016009c01
1702+010050000100500000000000000000000a0014002c01c8000000000009009c01
1703+0100500000000000000000000000000000000000000000000000000013009c01
1704+000100000100500000000000000000000000000000000000000000001c009c01
1705+01005000f3030000000000000000000000000000000000000000000001089d01
1706+03000000ef03000000000000090000000000000000000000000000006e657420
1707+7469746c6500000016009d01010050000100500000000000000000000a001400
1708+2c01c8000000000009009d010100500000000000000000000000000000000000
1709+000000000000000013009d010001000001005000000000000000000000000000
1710+00000000000000001c009d0101005000f3030000000000000000000000000000
1711+000000000000000001089e0103000000ef030000000000000900000000000000
1712+00000000000000006e6574207469746c6500000016009e010100500001005000
1713+00000000000000000a0014002c01c8000000000009009e010100500000000000
1714+000000000000000000000000000000000000000013009e010001000001005000
1715+00000000000000000000000000000000000000001c009e0101005000f3030000
1716+000000000000000000000000000000000000000001089f0103000000ef030000
1717+00000000090000000000000000000000000000006e6574207469746c65000000
1718+16009f01010050000100500000000000000000000a0014002c01c80000000000
1719+09009f0101005000000000000000000000000000000000000000000000000000
1720+13009f0100010000010050000000000000000000000000000000000000000000
1721+1c009f0101005000f30300000000000000000000000000000000000000000000
1722+0108a00103000000ef0300000000000009000000000000000000000000000000
1723+6e6574207469746c650000001600a00101005000010050000000000000000000
1724+0a0014002c01c800000000000900a00101005000000000000000000000000000
1725+0000000000000000000000001300a00100010000010050000000000000000000
1726+0000000000000000000000001c00a00101005000f30300000000000000000000
1727+0000000000000000000000000108a10103000000ef0300000000000009000000
1728+0000000000000000000000006e6574207469746c650000001600a10101005000
1729+0100500000000000000000000a0014002c01c800000000000900a10101005000
1730+0000000000000000000000000000000000000000000000001300a10100010000
1731+0100500000000000000000000000000000000000000000001c00a10101005000
1732+f303000000000000000000000000000000000000000000000108a20103000000
1733+ef03000000000000090000000000000000000000000000006e6574207469746c
1734+650000001600a201010050000100500000000000000000000a0014002c01c800
1735+000000000900a201010050000000000000000000000000000000000000000000
1736+000000001300a201000100000100500000000000000000000000000000000000
1737+000000001c00a20101005000f303000000000000000000000000000000000000
1738+000000000108a30103000000ef03000000000000090000000000000000000000
1739+000000006e6574207469746c650000001600a301010050000100500000000000
1740+000000000a0014002c01c800000000000900a301010050000000000000000000
1741+000000000000000000000000000000001300a301000100000100500000000000
1742+000000000000000000000000000000001c00a30101005000f303000000000000
1743+000000000000000000000000000000000108a40103000000ef03000000000000
1744+090000000000000000000000000000006e6574207469746c650000001600a401
1745+010050000100500000000000000000000a0014002c01c800000000000900a401
1746+010050000000000000000000000000000000000000000000000000001300a401
1747+000100000100500000000000000000000000000000000000000000001c00a401
1748+01005000f303000000000000000000000000000000000000000000000108a501
1749+03000000ef03000000000000090000000000000000000000000000006e657420
1750+7469746c650000001600a501010050000100500000000000000000000a001400
1751+2c01c800000000000900a5010100500000000000000000000000000000000000
1752+00000000000000001300a5010001000001005000000000000000000000000000
1753+00000000000000001c00a50101005000f3030000000000000000000000000000
1754+00000000000000000108a60103000000ef030000000000000900000000000000
1755+00000000000000006e6574207469746c650000001600a6010100500001005000
1756+00000000000000000a0014002c01c800000000000900a6010100500000000000
1757+00000000000000000000000000000000000000001300a6010001000001005000
1758+00000000000000000000000000000000000000001c00a60101005000f3030000
1759+00000000000000000000000000000000000000000108a70103000000ef030000
1760+00000000090000000000000000000000000000006e6574207469746c65000000
1761+1600a701010050000100500000000000000000000a0014002c01c80000000000
1762+0900a70101005000000000000000000000000000000000000000000000000000
1763+1300a70100010000010050000000000000000000000000000000000000000000
1764+1c00a70101005000f30300000000000000000000000000000000000000000000
1765+0108a80103000000ef0300000000000009000000000000000000000000000000
1766+6e6574207469746c650000001600a80101005000010050000000000000000000
1767+0a0014002c01c800000000000900a80101005000000000000000000000000000
1768+0000000000000000000000001300a80100010000010050000000000000000000
1769+0000000000000000000000001c00a80101005000f30300000000000000000000
1770+0000000000000000000000000108a90103000000ef0300000000000009000000
1771+0000000000000000000000006e6574207469746c650000001600a90101005000
1772+0100500000000000000000000a0014002c01c800000000000900a90101005000
1773+0000000000000000000000000000000000000000000000001300a90100010000
1774+0100500000000000000000000000000000000000000000001c00a90101005000
1775+f303000000000000000000000000000000000000000000000108aa0103000000
1776+ef03000000000000090000000000000000000000000000006e6574207469746c
1777+650000001600aa01010050000100500000000000000000000a0014002c01c800
1778+000000000900aa01010050000000000000000000000000000000000000000000
1779+000000001300aa01000100000100500000000000000000000000000000000000
1780+000000001c00aa0101005000f303000000000000000000000000000000000000
1781+000000000108ab0103000000ef03000000000000090000000000000000000000
1782+000000006e6574207469746c650000001600ab01010050000100500000000000
1783+000000000a0014002c01c800000000000900ab01010050000000000000000000
1784+000000000000000000000000000000001300ab01000100000100500000000000
1785+000000000000000000000000000000001c00ab0101005000f303000000000000
1786+000000000000000000000000000000000108ac0103000000ef03000000000000
1787+090000000000000000000000000000006e6574207469746c650000001600ac01
1788+010050000100500000000000000000000a0014002c01c800000000000900ac01
1789+010050000000000000000000000000000000000000000000000000001300ac01
1790+000100000100500000000000000000000000000000000000000000001c00ac01
1791+01005000f303000000000000000000000000000000000000000000000108ad01
1792+03000000ef03000000000000090000000000000000000000000000006e657420
1793+7469746c650000001600ad01010050000100500000000000000000000a001400
1794+2c01c800000000000900ad010100500000000000000000000000000000000000
1795+00000000000000001300ad010001000001005000000000000000000000000000
1796+00000000000000001c00ad0101005000f3030000000000000000000000000000
1797+00000000000000000108ae0103000000ef030000000000000900000000000000
1798+00000000000000006e6574207469746c650000001600ae010100500001005000
1799+00000000000000000a0014002c01c800000000000900ae010100500000000000
1800+00000000000000000000000000000000000000001300ae010001000001005000
1801+00000000000000000000000000000000000000001c00ae0101005000f3030000
1802+00000000000000000000000000000000000000000108af0103000000ef030000
1803+00000000090000000000000000000000000000006e6574207469746c65000000
1804+1600af01010050000100500000000000000000000a0014002c01c80000000000
1805+0900af0101005000000000000000000000000000000000000000000000000000
1806+1300af0100010000010050000000000000000000000000000000000000000000
1807+1c00af0101005000f30300000000000000000000000000000000000000000000
1808+0108b00103000000ef0300000000000009000000000000000000000000000000
1809+6e6574207469746c650000001600b00101005000010050000000000000000000
1810+0a0014002c01c800000000000900b00101005000000000000000000000000000
1811+0000000000000000000000001300b00100010000010050000000000000000000
1812+0000000000000000000000001c00b00101005000f30300000000000000000000
1813+0000000000000000000000000108b10103000000ef0300000000000009000000
1814+0000000000000000000000006e6574207469746c650000001600b10101005000
1815+0100500000000000000000000a0014002c01c800000000000900b10101005000
1816+0000000000000000000000000000000000000000000000001300b10100010000
1817+0100500000000000000000000000000000000000000000001c00b10101005000
1818+f303000000000000000000000000000000000000000000000108b20103000000
1819+ef03000000000000090000000000000000000000000000006e6574207469746c
1820+650000001600b201010050000100500000000000000000000a0014002c01c800
1821+000000000900b201010050000000000000000000000000000000000000000000
1822+000000001300b201000100000100500000000000000000000000000000000000
1823+000000001c00b20101005000f303000000000000000000000000000000000000
1824+000000000108b30103000000ef03000000000000090000000000000000000000
1825+000000006e6574207469746c650000001600b301010050000100500000000000
1826+000000000a0014002c01c800000000000900b301010050000000000000000000
1827+000000000000000000000000000000001300b301000100000100500000000000
1828+000000000000000000000000000000001c00b30101005000f303000000000000
1829+000000000000000000000000000000000108b40103000000ef03000000000000
1830+090000000000000000000000000000006e6574207469746c650000001600b401
1831+010050000100500000000000000000000a0014002c01c800000000000900b401
1832+010050000000000000000000000000000000000000000000000000001300b401
1833+000100000100500000000000000000000000000000000000000000001c00b401
1834+01005000f303000000000000000000000000000000000000000000000108b501
1835+03000000ef03000000000000090000000000000000000000000000006e657420
1836+7469746c650000001600b501010050000100500000000000000000000a001400
1837+2c01c800000000000900b5010100500000000000000000000000000000000000
1838+00000000000000001300b5010001000001005000000000000000000000000000
1839+00000000000000001c00b50101005000f3030000000000000000000000000000
1840+00000000000000000108b60103000000ef030000000000000900000000000000
1841+00000000000000006e6574207469746c650000001600b6010100500001005000
1842+00000000000000000a0014002c01c800000000000900b6010100500000000000
1843+00000000000000000000000000000000000000001300b6010001000001005000
1844+00000000000000000000000000000000000000001c00b60101005000f3030000
1845+00000000000000000000000000000000000000000108b70103000000ef030000
1846+00000000090000000000000000000000000000006e6574207469746c65000000
1847+1600b701010050000100500000000000000000000a0014002c01c80000000000
1848+0900b70101005000000000000000000000000000000000000000000000000000
1849+1300b70100010000010050000000000000000000000000000000000000000000
1850+1c00b70101005000f30300000000000000000000000000000000000000000000
1851+0108b80103000000ef0300000000000009000000000000000000000000000000
1852+6e6574207469746c650000001600b80101005000010050000000000000000000
1853+0a0014002c01c800000000000900b80101005000000000000000000000000000
1854+0000000000000000000000001300b80100010000010050000000000000000000
1855+0000000000000000000000001c00b80101005000f30300000000000000000000
1856+0000000000000000000000000108b90103000000ef0300000000000009000000
1857+0000000000000000000000006e6574207469746c650000001600b90101005000
1858+0100500000000000000000000a0014002c01c800000000000900b90101005000
1859+0000000000000000000000000000000000000000000000001300b90100010000
1860+0100500000000000000000000000000000000000000000001c00b90101005000
1861+f303000000000000000000000000000000000000000000000108ba0103000000
1862+ef03000000000000090000000000000000000000000000006e6574207469746c
1863+650000001600ba01010050000100500000000000000000000a0014002c01c800
1864+000000000900ba01010050000000000000000000000000000000000000000000
1865+000000001300ba01000100000100500000000000000000000000000000000000
1866+000000001c00ba0101005000f303000000000000000000000000000000000000
1867+000000000108bb0103000000ef03000000000000090000000000000000000000
1868+000000006e6574207469746c650000001600bb01010050000100500000000000
1869+000000000a0014002c01c800000000000900bb01010050000000000000000000
1870+000000000000000000000000000000001300bb01000100000100500000000000
1871+000000000000000000000000000000001c00bb0101005000f303000000000000
1872+000000000000000000000000000000000108bc0103000000ef03000000000000
1873+090000000000000000000000000000006e6574207469746c650000001600bc01
1874+010050000100500000000000000000000a0014002c01c800000000000900bc01
1875+010050000000000000000000000000000000000000000000000000001300bc01
1876+000100000100500000000000000000000000000000000000000000001c00bc01
1877+01005000f303000000000000000000000000000000000000000000000108bd01
1878+03000000ef03000000000000090000000000000000000000000000006e657420
1879+7469746c650000001600bd01010050000100500000000000000000000a001400
1880+2c01c800000000000900bd010100500000000000000000000000000000000000
1881+00000000000000001300bd010001000001005000000000000000000000000000
1882+00000000000000001c00bd0101005000f3030000000000000000000000000000
1883+00000000000000000108be0103000000ef030000000000000900000000000000
1884+00000000000000006e6574207469746c650000001600be010100500001005000
1885+00000000000000000a0014002c01c800000000000900be010100500000000000
1886+00000000000000000000000000000000000000001300be010001000001005000
1887+00000000000000000000000000000000000000001c00be0101005000f3030000
1888+00000000000000000000000000000000000000000108bf0103000000ef030000
1889+00000000090000000000000000000000000000006e6574207469746c65000000
1890+1600bf01010050000100500000000000000000000a0014002c01c80000000000
1891+0900bf0101005000000000000000000000000000000000000000000000000000
1892+1300bf0100010000010050000000000000000000000000000000000000000000
1893+1c00bf0101005000f30300000000000000000000000000000000000000000000
1894+0108c00103000000ef0300000000000009000000000000000000000000000000
1895+6e6574207469746c650000001600c00101005000010050000000000000000000
1896+0a0014002c01c800000000000900c00101005000000000000000000000000000
1897+0000000000000000000000001300c00100010000010050000000000000000000
1898+0000000000000000000000001c00c00101005000f30300000000000000000000
1899+0000000000000000000000000108c10103000000ef0300000000000009000000
1900+0000000000000000000000006e6574207469746c650000001600c10101005000
1901+0100500000000000000000000a0014002c01c800000000000900c10101005000
1902+0000000000000000000000000000000000000000000000001300c10100010000
1903+0100500000000000000000000000000000000000000000001c00c10101005000
1904+f303000000000000000000000000000000000000000000000108c20103000000
1905+ef03000000000000090000000000000000000000000000006e6574207469746c
1906+650000001600c201010050000100500000000000000000000a0014002c01c800
1907+000000000900c201010050000000000000000000000000000000000000000000
1908+000000001300c201000100000100500000000000000000000000000000000000
1909+000000001c00c20101005000f303000000000000000000000000000000000000
1910+000000000108c30103000000ef03000000000000090000000000000000000000
1911+000000006e6574207469746c650000001600c301010050000100500000000000
1912+000000000a0014002c01c800000000000900c301010050000000000000000000
1913+000000000000000000000000000000001300c301000100000100500000000000
1914+000000000000000000000000000000001c00c30101005000f303000000000000
1915+000000000000000000000000000000000108c40103000000ef03000000000000
1916+090000000000000000000000000000006e6574207469746c650000001600c401
1917+010050000100500000000000000000000a0014002c01c800000000000900c401
1918+010050000000000000000000000000000000000000000000000000001300c401
1919+000100000100500000000000000000000000000000000000000000001c00c401
1920+01005000f303000000000000000000000000000000000000000000000108c501
1921+03000000ef03000000000000090000000000000000000000000000006e657420
1922+7469746c650000001600c501010050000100500000000000000000000a001400
1923+2c01c800000000000900c5010100500000000000000000000000000000000000
1924+00000000000000001300c5010001000001005000000000000000000000000000
1925+00000000000000001c00c50101005000f3030000000000000000000000000000
1926+00000000000000000108c60103000000ef030000000000000900000000000000
1927+00000000000000006e6574207469746c650000001600c6010100500001005000
1928+00000000000000000a0014002c01c800000000000900c6010100500000000000
1929+00000000000000000000000000000000000000001300c6010001000001005000
1930+00000000000000000000000000000000000000001c00c60101005000f3030000
1931+00000000000000000000000000000000000000000108c70103000000ef030000
1932+00000000090000000000000000000000000000006e6574207469746c65000000
1933+1600c701010050000100500000000000000000000a0014002c01c80000000000
1934+0900c70101005000000000000000000000000000000000000000000000000000
1935+1300c70100010000010050000000000000000000000000000000000000000000
1936+1c00c70101005000f30300000000000000000000000000000000000000000000
1937+0108c80103000000ef0300000000000009000000000000000000000000000000
1938+6e6574207469746c650000001600c80101005000010050000000000000000000
1939+0a0014002c01c800000000000900c80101005000000000000000000000000000
1940+0000000000000000000000001300c80100010000010050000000000000000000
1941+0000000000000000000000001c00c80101005000f30300000000000000000000
1942+0000000000000000000000000108c90103000000ef0300000000000009000000
1943+0000000000000000000000006e6574207469746c650000001600c90101005000
1944+0100500000000000000000000a0014002c01c800000000000900c90101005000
1945+0000000000000000000000000000000000000000000000001300c90100010000
1946+0100500000000000000000000000000000000000000000001c00c90101005000
1947+f303000000000000000000000000000000000000000000000108ca0103000000
1948+ef03000000000000090000000000000000000000000000006e6574207469746c
1949+650000001600ca01010050000100500000000000000000000a0014002c01c800
1950+000000000900ca01010050000000000000000000000000000000000000000000
1951+000000001300ca01000100000100500000000000000000000000000000000000
1952+000000001c00ca0101005000f303000000000000000000000000000000000000
1953+000000000108cb0103000000ef03000000000000090000000000000000000000
1954+000000006e6574207469746c650000001600cb01010050000100500000000000
1955+000000000a0014002c01c800000000000900cb01010050000000000000000000
1956+000000000000000000000000000000001300cb01000100000100500000000000
1957+000000000000000000000000000000001c00cb0101005000f303000000000000
1958+000000000000000000000000000000000108cc0103000000ef03000000000000
1959+090000000000000000000000000000006e6574207469746c650000001600cc01
1960+010050000100500000000000000000000a0014002c01c800000000000900cc01
1961+010050000000000000000000000000000000000000000000000000001300cc01
1962+000100000100500000000000000000000000000000000000000000001c00cc01
1963+01005000f303000000000000000000000000000000000000000000000108cd01
1964+03000000ef03000000000000090000000000000000000000000000006e657420
1965+7469746c650000001600cd01010050000100500000000000000000000a001400
1966+2c01c800000000000900cd010100500000000000000000000000000000000000
1967+00000000000000001300cd010001000001005000000000000000000000000000
1968+00000000000000001c00cd0101005000f3030000000000000000000000000000
1969+00000000000000000108ce0103000000ef030000000000000900000000000000
1970+00000000000000006e6574207469746c650000001600ce010100500001005000
1971+00000000000000000a0014002c01c800000000000900ce010100500000000000
1972+00000000000000000000000000000000000000001300ce010001000001005000
1973+00000000000000000000000000000000000000001c00ce0101005000f3030000
1974+00000000000000000000000000000000000000000108cf0103000000ef030000
1975+00000000090000000000000000000000000000006e6574207469746c65000000
1976+1600cf01010050000100500000000000000000000a0014002c01c80000000000
1977+0900cf0101005000000000000000000000000000000000000000000000000000
1978+1300cf0100010000010050000000000000000000000000000000000000000000
1979+1c00cf0101005000f30300000000000000000000000000000000000000000000
1980+0108d00103000000ef0300000000000009000000000000000000000000000000
1981+6e6574207469746c650000001600d00101005000010050000000000000000000
1982+0a0014002c01c800000000000900d00101005000000000000000000000000000
1983+0000000000000000000000001300d00100010000010050000000000000000000
1984+0000000000000000000000001c00d00101005000f30300000000000000000000
1985+0000000000000000000000000108d10103000000ef0300000000000009000000
1986+0000000000000000000000006e6574207469746c650000001600d10101005000
1987+0100500000000000000000000a0014002c01c800000000000900d10101005000
1988+0000000000000000000000000000000000000000000000001300d10100010000
1989+0100500000000000000000000000000000000000000000001c00d10101005000
1990+f303000000000000000000000000000000000000000000000108d20103000000
1991+ef03000000000000090000000000000000000000000000006e6574207469746c
1992+650000001600d201010050000100500000000000000000000a0014002c01c800
1993+000000000900d201010050000000000000000000000000000000000000000000
1994+000000001300d201000100000100500000000000000000000000000000000000
1995+000000001c00d20101005000f303000000000000000000000000000000000000
1996+000000000108d30103000000ef03000000000000090000000000000000000000
1997+000000006e6574207469746c650000001600d301010050000100500000000000
1998+000000000a0014002c01c800000000000900d301010050000000000000000000
1999+000000000000000000000000000000001300d301000100000100500000000000
2000+000000000000000000000000000000001c00d30101005000f303000000000000
2001+000000000000000000000000000000000108d40103000000ef03000000000000
2002+090000000000000000000000000000006e6574207469746c650000001600d401
2003+010050000100500000000000000000000a0014002c01c800000000000900d401
2004+010050000000000000000000000000000000000000000000000000001300d401
2005+000100000100500000000000000000000000000000000000000000001c00d401
2006+01005000f303000000000000000000000000000000000000000000000108d501
2007+03000000ef03000000000000090000000000000000000000000000006e657420
2008+7469746c650000001600d501010050000100500000000000000000000a001400
2009+2c01c800000000000900d5010100500000000000000000000000000000000000
2010+00000000000000001300d5010001000001005000000000000000000000000000
2011+00000000000000001c00d50101005000f3030000000000000000000000000000
2012+00000000000000000108d60103000000ef030000000000000900000000000000
2013+00000000000000006e6574207469746c650000001600d6010100500001005000
2014+00000000000000000a0014002c01c800000000000900d6010100500000000000
2015+00000000000000000000000000000000000000001300d6010001000001005000
2016+00000000000000000000000000000000000000001c00d60101005000f3030000
2017+00000000000000000000000000000000000000000108d70103000000ef030000
2018+00000000090000000000000000000000000000006e6574207469746c65000000
2019+1600d701010050000100500000000000000000000a0014002c01c80000000000
2020+0900d70101005000000000000000000000000000000000000000000000000000
2021+1300d70100010000010050000000000000000000000000000000000000000000
2022+1c00d70101005000f30300000000000000000000000000000000000000000000
2023+0108d80103000000ef0300000000000009000000000000000000000000000000
2024+6e6574207469746c650000001600d80101005000010050000000000000000000
2025+0a0014002c01c800000000000900d80101005000000000000000000000000000
2026+0000000000000000000000001300d80100010000010050000000000000000000
2027+0000000000000000000000001c00d80101005000f30300000000000000000000
2028+0000000000000000000000000108d90103000000ef0300000000000009000000
2029+0000000000000000000000006e6574207469746c650000001600d90101005000
2030+0100500000000000000000000a0014002c01c800000000000900d90101005000
2031+0000000000000000000000000000000000000000000000001300d90100010000
2032+0100500000000000000000000000000000000000000000001c00d90101005000
2033+f303000000000000000000000000000000000000000000000108da0103000000
2034+ef03000000000000090000000000000000000000000000006e6574207469746c
2035+650000001600da01010050000100500000000000000000000a0014002c01c800
2036+000000000900da01010050000000000000000000000000000000000000000000
2037+000000001300da01000100000100500000000000000000000000000000000000
2038+000000001c00da0101005000f303000000000000000000000000000000000000
2039+000000000108db0103000000ef03000000000000090000000000000000000000
2040+000000006e6574207469746c650000001600db01010050000100500000000000
2041+000000000a0014002c01c800000000000900db01010050000000000000000000
2042+000000000000000000000000000000001300db01000100000100500000000000
2043+000000000000000000000000000000001c00db0101005000f303000000000000
2044+000000000000000000000000000000000108dc0103000000ef03000000000000
2045+090000000000000000000000000000006e6574207469746c650000001600dc01
2046+010050000100500000000000000000000a0014002c01c800000000000900dc01
2047+010050000000000000000000000000000000000000000000000000001300dc01
2048+000100000100500000000000000000000000000000000000000000001c00dc01
2049+01005000f303000000000000000000000000000000000000000000000108dd01
2050+03000000ef03000000000000090000000000000000000000000000006e657420
2051+7469746c650000001600dd01010050000100500000000000000000000a001400
2052+2c01c800000000000900dd010100500000000000000000000000000000000000
2053+00000000000000001300dd010001000001005000000000000000000000000000
2054+00000000000000001c00dd0101005000f3030000000000000000000000000000
2055+00000000000000000108de0103000000ef030000000000000900000000000000
2056+00000000000000006e6574207469746c650000001600de010100500001005000
2057+00000000000000000a0014002c01c800000000000900de010100500000000000
2058+00000000000000000000000000000000000000001300de010001000001005000
2059+00000000000000000000000000000000000000001c00de0101005000f3030000
2060+00000000000000000000000000000000000000000108df0103000000ef030000
2061+00000000090000000000000000000000000000006e6574207469746c65000000
2062+1600df01010050000100500000000000000000000a0014002c01c80000000000
2063+0900df0101005000000000000000000000000000000000000000000000000000
2064+1300df0100010000010050000000000000000000000000000000000000000000
2065+1c00df0101005000f30300000000000000000000000000000000000000000000
2066+0108e00103000000ef0300000000000009000000000000000000000000000000
2067+6e6574207469746c650000001600e00101005000010050000000000000000000
2068+0a0014002c01c800000000000900e00101005000000000000000000000000000
2069+0000000000000000000000001300e00100010000010050000000000000000000
2070+0000000000000000000000001c00e00101005000f30300000000000000000000
2071+0000000000000000000000000108e10103000000ef0300000000000009000000
2072+0000000000000000000000006e6574207469746c650000001600e10101005000
2073+0100500000000000000000000a0014002c01c800000000000900e10101005000
2074+0000000000000000000000000000000000000000000000001300e10100010000
2075+0100500000000000000000000000000000000000000000001c00e10101005000
2076+f303000000000000000000000000000000000000000000000108e20103000000
2077+ef03000000000000090000000000000000000000000000006e6574207469746c
2078+650000001600e201010050000100500000000000000000000a0014002c01c800
2079+000000000900e201010050000000000000000000000000000000000000000000
2080+000000001300e201000100000100500000000000000000000000000000000000
2081+000000001c00e20101005000f303000000000000000000000000000000000000
2082+000000000108e30103000000ef03000000000000090000000000000000000000
2083+000000006e6574207469746c650000001600e301010050000100500000000000
2084+000000000a0014002c01c800000000000900e301010050000000000000000000
2085+000000000000000000000000000000001300e301000100000100500000000000
2086+000000000000000000000000000000001c00e30101005000f303000000000000
2087+000000000000000000000000000000000108e40103000000ef03000000000000
2088+090000000000000000000000000000006e6574207469746c650000001600e401
2089+010050000100500000000000000000000a0014002c01c800000000000900e401
2090+010050000000000000000000000000000000000000000000000000001300e401
2091+000100000100500000000000000000000000000000000000000000001c00e401
2092+01005000f303000000000000000000000000000000000000000000000108e501
2093+03000000ef03000000000000090000000000000000000000000000006e657420
2094+7469746c650000001600e501010050000100500000000000000000000a001400
2095+2c01c800000000000900e5010100500000000000000000000000000000000000
2096+00000000000000001300e5010001000001005000000000000000000000000000
2097+00000000000000001c00e50101005000f3030000000000000000000000000000
2098+00000000000000000108e60103000000ef030000000000000900000000000000
2099+00000000000000006e6574207469746c650000001600e6010100500001005000
2100+00000000000000000a0014002c01c800000000000900e6010100500000000000
2101+00000000000000000000000000000000000000001300e6010001000001005000
2102+00000000000000000000000000000000000000001c00e60101005000f3030000
2103+00000000000000000000000000000000000000000108e70103000000ef030000
2104+00000000090000000000000000000000000000006e6574207469746c65000000
2105+1600e701010050000100500000000000000000000a0014002c01c80000000000
2106+0900e70101005000000000000000000000000000000000000000000000000000
2107+1300e70100010000010050000000000000000000000000000000000000000000
2108+1c00e70101005000f30300000000000000000000000000000000000000000000
2109+0108e80103000000ef0300000000000009000000000000000000000000000000
2110+6e6574207469746c650000001600e80101005000010050000000000000000000
2111+0a0014002c01c800000000000900e80101005000000000000000000000000000
2112+0000000000000000000000001300e80100010000010050000000000000000000
2113+0000000000000000000000001c00e80101005000f30300000000000000000000
2114+0000000000000000000000000108e90103000000ef0300000000000009000000
2115+0000000000000000000000006e6574207469746c650000001600e90101005000
2116+0100500000000000000000000a0014002c01c800000000000900e90101005000
2117+0000000000000000000000000000000000000000000000001300e90100010000
2118+0100500000000000000000000000000000000000000000001c00e90101005000
2119+f303000000000000000000000000000000000000000000000108ea0103000000
2120+ef03000000000000090000000000000000000000000000006e6574207469746c
2121+650000001600ea01010050000100500000000000000000000a0014002c01c800
2122+000000000900ea01010050000000000000000000000000000000000000000000
2123+000000001300ea01000100000100500000000000000000000000000000000000
2124+000000001c00ea0101005000f303000000000000000000000000000000000000
2125+000000000108eb0103000000ef03000000000000090000000000000000000000
2126+000000006e6574207469746c650000001600eb01010050000100500000000000
2127+000000000a0014002c01c800000000000900eb01010050000000000000000000
2128+000000000000000000000000000000001300eb01000100000100500000000000
2129+000000000000000000000000000000001c00eb0101005000f303000000000000
2130+000000000000000000000000000000000108ec0103000000ef03000000000000
2131+090000000000000000000000000000006e6574207469746c650000001600ec01
2132+010050000100500000000000000000000a0014002c01c800000000000900ec01
2133+010050000000000000000000000000000000000000000000000000001300ec01
2134+000100000100500000000000000000000000000000000000000000001c00ec01
2135+01005000f303000000000000000000000000000000000000000000000108ed01
2136+03000000ef03000000000000090000000000000000000000000000006e657420
2137+7469746c650000001600ed01010050000100500000000000000000000a001400
2138+2c01c800000000000900ed010100500000000000000000000000000000000000
2139+00000000000000001300ed010001000001005000000000000000000000000000
2140+00000000000000001c00ed0101005000f3030000000000000000000000000000
2141+00000000000000000108ee0103000000ef030000000000000900000000000000
2142+00000000000000006e6574207469746c650000001600ee010100500001005000
2143+00000000000000000a0014002c01c800000000000900ee010100500000000000
2144+00000000000000000000000000000000000000001300ee010001000001005000
2145+00000000000000000000000000000000000000001c00ee0101005000f3030000
2146+00000000000000000000000000000000000000000108ef0103000000ef030000
2147+00000000090000000000000000000000000000006e6574207469746c65000000
2148+1600ef01010050000100500000000000000000000a0014002c01c80000000000
2149+0900ef0101005000000000000000000000000000000000000000000000000000
2150+1300ef0100010000010050000000000000000000000000000000000000000000
M internal/adapters/wayland/xwm/xpeer_test.go +135 -3
@@ -18,6 +18,7 @@ const (
1818 opChangeWindowAttributes = 2
1919 opGetWindowAttributes = 3
2020 opMapWindow = 8
21+ opDeleteProperty = 19
2122 opConfigureWindow = 12
2223 opGetGeometry = 14
2324 opQueryTree = 15
@@ -80,7 +81,13 @@ type xpeer struct {
8081 geoms map[uint32]xpeerGeom
8182 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}
8283 children []uint32
83- denyRoot bool // answer the root event-mask request with BadAccess
84+ denyRoot bool // answer the root event-mask request with BadAccess
85+ pids map[uint32]uint32 // XRes QueryClientIds answers, by window
86+ bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow
87+ hold bool // keep replies until release
88+ held [][]byte
89+ tap []byte // everything written to the client, when recording
90+ record bool
8491
8592 gate atomic.Pointer[chan struct{}] // closed = reading allowed
8693 done chan struct{}
@@ -108,12 +115,14 @@ func startXPeer(t *testing.T, exts map[string]xpeerExt) (int, *xpeer) {
108115 t: t, f: os.NewFile(uintptr(fds[1]), "xpeer"),
109116 exts: exts, atoms: map[string]uint32{}, nextAtom: 1000,
110117 props: map[uint32]map[uint32]xpeerProp{}, geoms: map[uint32]xpeerGeom{}, attrs: map[uint32][2]byte{},
118+ pids: map[uint32]uint32{}, bad: map[uint32]bool{},
111119 done: make(chan struct{}),
112120 }
113121 open := make(chan struct{})
114122 close(open)
115123 p.gate.Store(&open)
116124 t.Cleanup(func() {
125+ p.resume() // a paused peer would never see the close
117126 p.f.Close()
118127 <-p.done
119128 })
@@ -179,7 +188,12 @@ func (p *xpeer) serve() {
179188 }
180189
181190 // write sends bytes to the client. The caller holds p.mu.
182-func (p *xpeer) write(b []byte) { _, _ = p.f.Write(b) }
191+func (p *xpeer) write(b []byte) {
192+ if p.record {
193+ p.tap = append(p.tap, b...)
194+ }
195+ _, _ = p.f.Write(b)
196+}
183197
184198 func (p *xpeer) reply(data uint8, body []byte) {
185199 words := (max(len(body), 24) - 24 + 3) / 4
@@ -188,9 +202,31 @@ func (p *xpeer) reply(data uint8, body []byte) {
188202 binary.LittleEndian.PutUint16(b[2:], p.seq)
189203 binary.LittleEndian.PutUint32(b[4:], uint32(words))
190204 copy(b[8:], body)
205+ if p.hold {
206+ p.held = append(p.held, b)
207+ return
208+ }
191209 p.write(b)
192210 }
193211
212+// release sends the held replies, in request order as a real server does.
213+func (p *xpeer) release() {
214+ p.mu.Lock()
215+ defer p.mu.Unlock()
216+ p.hold = false
217+ for _, b := range p.held {
218+ p.write(b)
219+ }
220+ p.held = nil
221+}
222+
223+// holdReplies keeps the replies of the following requests back.
224+func (p *xpeer) holdReplies() {
225+ p.mu.Lock()
226+ p.hold = true
227+ p.mu.Unlock()
228+}
229+
194230 func (p *xpeer) errorPacket(code, major uint8, bad uint32) {
195231 b := make([]byte, 32)
196232 b[1] = code
@@ -252,6 +288,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
252288 b[18] = a[1] // map_state is byte 26 of the reply
253289 b[19] = a[0] // override_redirect, byte 27
254290 p.reply(0, b)
291+ case (r.major == opGetGeometry || r.major == opGetProperty) && p.bad[binary.LittleEndian.Uint32(body)]:
292+ p.errorPacket(3, r.major, binary.LittleEndian.Uint32(body)) // BadWindow
255293 case r.major == opGetGeometry:
256294 g := p.geoms[binary.LittleEndian.Uint32(body)]
257295 b := make([]byte, 24)
@@ -272,6 +310,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
272310 typ: binary.LittleEndian.Uint32(body[8:]), format: format,
273311 data: append([]byte(nil), body[20:20+n*int(format)/8]...),
274312 }
313+ case r.major == opDeleteProperty:
314+ delete(p.props[binary.LittleEndian.Uint32(body)], binary.LittleEndian.Uint32(body[4:]))
275315 case r.major == opGetProperty:
276316 win, prop := binary.LittleEndian.Uint32(body), binary.LittleEndian.Uint32(body[4:])
277317 v, ok := p.props[win][prop]
@@ -300,8 +340,22 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
300340 p.reply(0, le32(5, 4))
301341 }
302342 case "X-Resource":
303- if r.minor == 0 {
343+ switch r.minor {
344+ case 0:
304345 p.reply(0, []byte{1, 0, 2, 0})
346+ case 4: // QueryClientIds: one spec, answered when a pid is scripted
347+ pid, ok := p.pids[r.u32(8)]
348+ if !ok {
349+ p.reply(0, le32(0))
350+ break
351+ }
352+ b := make([]byte, 40)
353+ binary.LittleEndian.PutUint32(b[0:], 1)
354+ binary.LittleEndian.PutUint32(b[24:], r.u32(8))
355+ binary.LittleEndian.PutUint32(b[28:], 2) // LocalClientPID
356+ binary.LittleEndian.PutUint32(b[32:], 4)
357+ binary.LittleEndian.PutUint32(b[36:], pid)
358+ p.reply(0, b)
305359 }
306360 }
307361 }
@@ -409,3 +463,81 @@ func (p *xpeer) hangup() {
409463 _ = rc.Control(func(fd uintptr) { _ = unix.Shutdown(int(fd), unix.SHUT_RDWR) })
410464 }
411465 }
466+
467+// setProp scripts a window property for GetProperty.
468+func (p *xpeer) setProp(win, atom, typ uint32, format uint8, data []byte) {
469+ p.mu.Lock()
470+ defer p.mu.Unlock()
471+ if p.props[win] == nil {
472+ p.props[win] = map[uint32]xpeerProp{}
473+ }
474+ p.props[win][atom] = xpeerProp{typ: typ, format: format, data: data}
475+}
476+
477+func (p *xpeer) mapRequest(win uint32) {
478+ p.event(20, func(b *[32]byte) {
479+ binary.LittleEndian.PutUint32(b[4:], peerRoot)
480+ binary.LittleEndian.PutUint32(b[8:], win)
481+ })
482+}
483+
484+func (p *xpeer) mapNotify(win uint32) {
485+ p.event(19, func(b *[32]byte) {
486+ binary.LittleEndian.PutUint32(b[4:], peerRoot)
487+ binary.LittleEndian.PutUint32(b[8:], win)
488+ })
489+}
490+
491+func (p *xpeer) unmapNotify(win uint32, synthetic bool) {
492+ p.event(18, func(b *[32]byte) {
493+ if synthetic {
494+ b[0] |= 0x80
495+ }
496+ binary.LittleEndian.PutUint32(b[4:], peerRoot)
497+ binary.LittleEndian.PutUint32(b[8:], win)
498+ })
499+}
500+
501+func (p *xpeer) propertyNotify(win, atom uint32, deleted bool) {
502+ p.event(28, func(b *[32]byte) {
503+ binary.LittleEndian.PutUint32(b[4:], win)
504+ binary.LittleEndian.PutUint32(b[8:], atom)
505+ if deleted {
506+ b[16] = 1
507+ }
508+ })
509+}
510+
511+func (p *xpeer) reparentNotify(win, parent uint32) {
512+ p.event(21, func(b *[32]byte) {
513+ binary.LittleEndian.PutUint32(b[4:], peerRoot)
514+ binary.LittleEndian.PutUint32(b[8:], win)
515+ binary.LittleEndian.PutUint32(b[12:], parent)
516+ })
517+}
518+
519+func (p *xpeer) clientMessage(win, typ uint32, data ...uint32) {
520+ p.event(33, func(b *[32]byte) {
521+ b[1] = 32
522+ binary.LittleEndian.PutUint32(b[4:], win)
523+ binary.LittleEndian.PutUint32(b[8:], typ)
524+ for i, d := range data {
525+ binary.LittleEndian.PutUint32(b[12+4*i:], d)
526+ }
527+ })
528+}
529+
530+func (p *xpeer) focusIn(win uint32) {
531+ p.event(9, func(b *[32]byte) { binary.LittleEndian.PutUint32(b[4:], win) })
532+}
533+
534+func (p *xpeer) configureNotify(win uint32) {
535+ p.event(22, func(b *[32]byte) {
536+ binary.LittleEndian.PutUint32(b[4:], win)
537+ binary.LittleEndian.PutUint32(b[8:], win)
538+ binary.LittleEndian.PutUint16(b[20:], 10)
539+ binary.LittleEndian.PutUint16(b[22:], 20)
540+ binary.LittleEndian.PutUint16(b[24:], 300)
541+ binary.LittleEndian.PutUint16(b[26:], 200)
542+ })
543+}
M internal/adapters/wayland/xwm/xwm.go +2 -1
@@ -1,4 +1,4 @@
1-//lint:file-ignore U1000 pairing, focus and stacking state is used by the flows that build on this skeleton
1+//lint:file-ignore U1000 refocus and listsDirty are used by the focus and configure flows
22
33 // Package xwm is the built-in X11 window manager for Xwayland: it speaks the
44 // X protocol over the -wm socket with xturbo and reports managed windows to
@@ -66,6 +66,7 @@ type XWM struct {
6666 posted, writable, closed bool
6767 bootErr error
6868 warnedRing, warnedFull bool
69+ warnedUnpaired bool
6970
7071 scratch []byte // encode buffer for 32-bit property values, 4 bytes per slot
7172

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 23

Tags 10

↑↓ moveenter openesc close