{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,29 +1,29 @@\n-Zip file size: 65745 bytes, number of entries: 27\n+Zip file size: 66789 bytes, number of entries: 27\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/\n -rw----     2.0 fat     4792 bX stor 70-Jan-01 00:00 META-INF/DEPENDENCIES\n -rw----     2.0 fat    11358 bX stor 70-Jan-01 00:00 META-INF/LICENSE\n -rw----     2.0 fat       25 bX stor 70-Jan-01 00:00 META-INF/MANIFEST.MF\n -rw----     2.0 fat      178 bX stor 70-Jan-01 00:00 META-INF/NOTICE\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/dubbo/internal/\n -rw----     2.0 fat       63 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw----     2.0 fat       69 bX stor 70-Jan-01 00:00 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/\n -rw----     2.0 fat        0 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.properties\n--rw----     2.0 fat     2450 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml\n+-rw----     2.0 fat     2385 bX stor 70-Jan-01 00:00 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/\n -rw----     2.0 fat        0 bx stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/\n--rw----     2.0 fat     1601 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/AbstractConsulRegistry.java\n--rw----     2.0 fat     2515 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulParameter.java\n--rw----     2.0 fat    14467 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulRegistry.java\n--rw----     2.0 fat     1233 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulRegistryFactory.java\n--rw----     2.0 fat    18301 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java\n--rw----     2.0 fat     1233 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java\n--rw----     2.0 fat     1233 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD\n--rw----     2.0 fat     1233 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master\n-27 files, 60751 bytes uncompressed, 60751 bytes compressed:  0.0%\n+-rw----     2.0 fat     1640 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/AbstractConsulRegistry.java\n+-rw----     2.0 fat     2602 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulParameter.java\n+-rw----     2.0 fat    14847 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulRegistry.java\n+-rw----     2.0 fat     1265 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulRegistryFactory.java\n+-rw----     2.0 fat    18782 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java\n+-rw----     2.0 fat     1263 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java\n+-rw----     2.0 fat     1263 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD\n+-rw----     2.0 fat     1263 bX stor 70-Jan-01 00:00 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master\n+27 files, 61795 bytes uncompressed, 61795 bytes compressed:  0.0%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -340,1156 +340,1156 @@\n #\n 044DD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 044DF   Length              0005 (5)\n 044E1   Flags               01 (1) 'Modification'\n 044E2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n 044E6 PAYLOAD\n \n-04E78 DATA DESCRIPTOR       08074B50 (134695760)\n-04E7C CRC                   178839D9 (394803673)\n-04E80 Compressed Size       00000992 (2450)\n-04E84 Uncompressed Size     00000992 (2450)\n-\n-04E88 LOCAL HEADER #15      04034B50 (67324752)\n-04E8C Extract Zip Spec      14 (20) '2.0'\n-04E8D Extract OS            00 (0) 'MS-DOS'\n-04E8E General Purpose Flag  0000 (0)\n-04E90 Compression Method    0000 (0) 'Stored'\n-04E92 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04E96 CRC                   00000000 (0)\n-04E9A Compressed Size       00000000 (0)\n-04E9E Uncompressed Size     00000000 (0)\n-04EA2 Filename Length       0004 (4)\n-04EA4 Extra Length          0009 (9)\n-04EA6 Filename              'XXXX'\n-#\n-# WARNING: Offset 0x4EA6: Filename 'XXXX'\n-#          Zero length filename\n-#\n-04EAA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04EAC   Length              0005 (5)\n-04EAE   Flags               01 (1) 'Modification'\n-04EAF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04EB3 LOCAL HEADER #16      04034B50 (67324752)\n-04EB7 Extract Zip Spec      14 (20) '2.0'\n-04EB8 Extract OS            00 (0) 'MS-DOS'\n-04EB9 General Purpose Flag  0000 (0)\n-04EBB Compression Method    0000 (0) 'Stored'\n-04EBD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04EC1 CRC                   00000000 (0)\n-04EC5 Compressed Size       00000000 (0)\n-04EC9 Uncompressed Size     00000000 (0)\n-04ECD Filename Length       000B (11)\n-04ECF Extra Length          0009 (9)\n-04ED1 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4ED1: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04EDC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04EDE   Length              0005 (5)\n-04EE0   Flags               01 (1) 'Modification'\n-04EE1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04EE5 LOCAL HEADER #17      04034B50 (67324752)\n-04EE9 Extract Zip Spec      14 (20) '2.0'\n-04EEA Extract OS            00 (0) 'MS-DOS'\n-04EEB General Purpose Flag  0000 (0)\n-04EED Compression Method    0000 (0) 'Stored'\n-04EEF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04EF3 CRC                   00000000 (0)\n-04EF7 Compressed Size       00000000 (0)\n-04EFB Uncompressed Size     00000000 (0)\n-04EFF Filename Length       0011 (17)\n-04F01 Extra Length          0009 (9)\n-04F03 Filename              'XXXXXXXXXXXXXXXXX'\n+04E37 DATA DESCRIPTOR       08074B50 (134695760)\n+04E3B CRC                   136E4489 (325993609)\n+04E3F Compressed Size       00000951 (2385)\n+04E43 Uncompressed Size     00000951 (2385)\n+\n+04E47 LOCAL HEADER #15      04034B50 (67324752)\n+04E4B Extract Zip Spec      14 (20) '2.0'\n+04E4C Extract OS            00 (0) 'MS-DOS'\n+04E4D General Purpose Flag  0000 (0)\n+04E4F Compression Method    0000 (0) 'Stored'\n+04E51 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04E55 CRC                   00000000 (0)\n+04E59 Compressed Size       00000000 (0)\n+04E5D Uncompressed Size     00000000 (0)\n+04E61 Filename Length       0004 (4)\n+04E63 Extra Length          0009 (9)\n+04E65 Filename              'XXXX'\n+#\n+# WARNING: Offset 0x4E65: Filename 'XXXX'\n+#          Zero length filename\n+#\n+04E69 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04E6B   Length              0005 (5)\n+04E6D   Flags               01 (1) 'Modification'\n+04E6E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04E72 LOCAL HEADER #16      04034B50 (67324752)\n+04E76 Extract Zip Spec      14 (20) '2.0'\n+04E77 Extract OS            00 (0) 'MS-DOS'\n+04E78 General Purpose Flag  0000 (0)\n+04E7A Compression Method    0000 (0) 'Stored'\n+04E7C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04E80 CRC                   00000000 (0)\n+04E84 Compressed Size       00000000 (0)\n+04E88 Uncompressed Size     00000000 (0)\n+04E8C Filename Length       000B (11)\n+04E8E Extra Length          0009 (9)\n+04E90 Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4E90: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04E9B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04E9D   Length              0005 (5)\n+04E9F   Flags               01 (1) 'Modification'\n+04EA0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04EA4 LOCAL HEADER #17      04034B50 (67324752)\n+04EA8 Extract Zip Spec      14 (20) '2.0'\n+04EA9 Extract OS            00 (0) 'MS-DOS'\n+04EAA General Purpose Flag  0000 (0)\n+04EAC Compression Method    0000 (0) 'Stored'\n+04EAE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04EB2 CRC                   00000000 (0)\n+04EB6 Compressed Size       00000000 (0)\n+04EBA Uncompressed Size     00000000 (0)\n+04EBE Filename Length       0011 (17)\n+04EC0 Extra Length          0009 (9)\n+04EC2 Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4EC2: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04ED3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04ED5   Length              0005 (5)\n+04ED7   Flags               01 (1) 'Modification'\n+04ED8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04EDC LOCAL HEADER #18      04034B50 (67324752)\n+04EE0 Extract Zip Spec      14 (20) '2.0'\n+04EE1 Extract OS            00 (0) 'MS-DOS'\n+04EE2 General Purpose Flag  0000 (0)\n+04EE4 Compression Method    0000 (0) 'Stored'\n+04EE6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04EEA CRC                   00000000 (0)\n+04EEE Compressed Size       00000000 (0)\n+04EF2 Uncompressed Size     00000000 (0)\n+04EF6 Filename Length       001A (26)\n+04EF8 Extra Length          0009 (9)\n+04EFA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F03: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4EFA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 04F14 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 04F16   Length              0005 (5)\n 04F18   Flags               01 (1) 'Modification'\n 04F19   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n \n-04F1D LOCAL HEADER #18      04034B50 (67324752)\n+04F1D LOCAL HEADER #19      04034B50 (67324752)\n 04F21 Extract Zip Spec      14 (20) '2.0'\n 04F22 Extract OS            00 (0) 'MS-DOS'\n 04F23 General Purpose Flag  0000 (0)\n 04F25 Compression Method    0000 (0) 'Stored'\n 04F27 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n 04F2B CRC                   00000000 (0)\n 04F2F Compressed Size       00000000 (0)\n 04F33 Uncompressed Size     00000000 (0)\n-04F37 Filename Length       001A (26)\n+04F37 Filename Length       0021 (33)\n 04F39 Extra Length          0009 (9)\n-04F3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+04F3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-04F55 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04F57   Length              0005 (5)\n-04F59   Flags               01 (1) 'Modification'\n-04F5A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04F5E LOCAL HEADER #19      04034B50 (67324752)\n-04F62 Extract Zip Spec      14 (20) '2.0'\n-04F63 Extract OS            00 (0) 'MS-DOS'\n-04F64 General Purpose Flag  0000 (0)\n-04F66 Compression Method    0000 (0) 'Stored'\n-04F68 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04F6C CRC                   00000000 (0)\n-04F70 Compressed Size       00000000 (0)\n-04F74 Uncompressed Size     00000000 (0)\n-04F78 Filename Length       0021 (33)\n-04F7A Extra Length          0009 (9)\n-04F7C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4F7C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-04F9D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-04F9F   Length              0005 (5)\n-04FA1   Flags               01 (1) 'Modification'\n-04FA2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-04FA6 LOCAL HEADER #20      04034B50 (67324752)\n-04FAA Extract Zip Spec      14 (20) '2.0'\n-04FAB Extract OS            00 (0) 'MS-DOS'\n-04FAC General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-04FAE Compression Method    0000 (0) 'Stored'\n-04FB0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-04FB4 CRC                   00000000 (0)\n-04FB8 Compressed Size       00000000 (0)\n-04FBC Uncompressed Size     00000000 (0)\n-04FC0 Filename Length       003C (60)\n-04FC2 Extra Length          0009 (9)\n-04FC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x4FC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-05000 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-05002   Length              0005 (5)\n-05004   Flags               01 (1) 'Modification'\n-05005   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-05009 PAYLOAD\n-\n-0564A DATA DESCRIPTOR       08074B50 (134695760)\n-0564E CRC                   DD92E439 (3717391417)\n-05652 Compressed Size       00000641 (1601)\n-05656 Uncompressed Size     00000641 (1601)\n-\n-0565A LOCAL HEADER #21      04034B50 (67324752)\n-0565E Extract Zip Spec      14 (20) '2.0'\n-0565F Extract OS            00 (0) 'MS-DOS'\n-05660 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-05662 Compression Method    0000 (0) 'Stored'\n-05664 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-05668 CRC                   00000000 (0)\n-0566C Compressed Size       00000000 (0)\n-05670 Uncompressed Size     00000000 (0)\n-05674 Filename Length       0035 (53)\n-05676 Extra Length          0009 (9)\n-05678 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x5678: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-056AD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-056AF   Length              0005 (5)\n-056B1   Flags               01 (1) 'Modification'\n-056B2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-056B6 PAYLOAD\n-\n-06089 DATA DESCRIPTOR       08074B50 (134695760)\n-0608D CRC                   1FAE29F0 (531507696)\n-06091 Compressed Size       000009D3 (2515)\n-06095 Uncompressed Size     000009D3 (2515)\n-\n-06099 LOCAL HEADER #22      04034B50 (67324752)\n-0609D Extract Zip Spec      14 (20) '2.0'\n-0609E Extract OS            00 (0) 'MS-DOS'\n-0609F General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-060A1 Compression Method    0000 (0) 'Stored'\n-060A3 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-060A7 CRC                   00000000 (0)\n-060AB Compressed Size       00000000 (0)\n-060AF Uncompressed Size     00000000 (0)\n-060B3 Filename Length       0034 (52)\n-060B5 Extra Length          0009 (9)\n-060B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x60B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-060EB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-060ED   Length              0005 (5)\n-060EF   Flags               01 (1) 'Modification'\n-060F0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-060F4 PAYLOAD\n-\n-09977 DATA DESCRIPTOR       08074B50 (134695760)\n-0997B CRC                   CF695E4A (3479789130)\n-0997F Compressed Size       00003883 (14467)\n-09983 Uncompressed Size     00003883 (14467)\n-\n-09987 LOCAL HEADER #23      04034B50 (67324752)\n-0998B Extract Zip Spec      14 (20) '2.0'\n-0998C Extract OS            00 (0) 'MS-DOS'\n-0998D General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0998F Compression Method    0000 (0) 'Stored'\n-09991 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-09995 CRC                   00000000 (0)\n-09999 Compressed Size       00000000 (0)\n-0999D Uncompressed Size     00000000 (0)\n-099A1 Filename Length       003B (59)\n-099A3 Extra Length          0009 (9)\n-099A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x99A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-099E0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-099E2   Length              0005 (5)\n-099E4   Flags               01 (1) 'Modification'\n-099E5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-099E9 PAYLOAD\n-\n-09EBA DATA DESCRIPTOR       08074B50 (134695760)\n-09EBE CRC                   EE6324FC (3999474940)\n-09EC2 Compressed Size       000004D1 (1233)\n-09EC6 Uncompressed Size     000004D1 (1233)\n-\n-09ECA LOCAL HEADER #24      04034B50 (67324752)\n-09ECE Extract Zip Spec      14 (20) '2.0'\n-09ECF Extract OS            00 (0) 'MS-DOS'\n-09ED0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-09ED2 Compression Method    0000 (0) 'Stored'\n-09ED4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-09ED8 CRC                   00000000 (0)\n-09EDC Compressed Size       00000000 (0)\n-09EE0 Uncompressed Size     00000000 (0)\n-09EE4 Filename Length       003C (60)\n-09EE6 Extra Length          0009 (9)\n-09EE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x9EE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-09F24 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-09F26   Length              0005 (5)\n-09F28   Flags               01 (1) 'Modification'\n-09F29   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-09F2D PAYLOAD\n-\n-0E6AA DATA DESCRIPTOR       08074B50 (134695760)\n-0E6AE CRC                   8A186986 (2316855686)\n-0E6B2 Compressed Size       0000477D (18301)\n-0E6B6 Uncompressed Size     0000477D (18301)\n-\n-0E6BA LOCAL HEADER #25      04034B50 (67324752)\n-0E6BE Extract Zip Spec      14 (20) '2.0'\n-0E6BF Extract OS            00 (0) 'MS-DOS'\n-0E6C0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0E6C2 Compression Method    0000 (0) 'Stored'\n-0E6C4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0E6C8 CRC                   00000000 (0)\n-0E6CC Compressed Size       00000000 (0)\n-0E6D0 Uncompressed Size     00000000 (0)\n-0E6D4 Filename Length       0043 (67)\n-0E6D6 Extra Length          0009 (9)\n-0E6D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xE6D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0E71B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0E71D   Length              0005 (5)\n-0E71F   Flags               01 (1) 'Modification'\n-0E720   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0E724 PAYLOAD\n-\n-0EBF5 DATA DESCRIPTOR       08074B50 (134695760)\n-0EBF9 CRC                   35541C2F (894704687)\n-0EBFD Compressed Size       000004D1 (1233)\n-0EC01 Uncompressed Size     000004D1 (1233)\n-\n-0EC05 LOCAL HEADER #26      04034B50 (67324752)\n-0EC09 Extract Zip Spec      14 (20) '2.0'\n-0EC0A Extract OS            00 (0) 'MS-DOS'\n-0EC0B General Purpose Flag  0808 (2056)\n+04F5C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04F5E   Length              0005 (5)\n+04F60   Flags               01 (1) 'Modification'\n+04F61   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+04F65 LOCAL HEADER #20      04034B50 (67324752)\n+04F69 Extract Zip Spec      14 (20) '2.0'\n+04F6A Extract OS            00 (0) 'MS-DOS'\n+04F6B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+04F6D Compression Method    0000 (0) 'Stored'\n+04F6F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+04F73 CRC                   00000000 (0)\n+04F77 Compressed Size       00000000 (0)\n+04F7B Uncompressed Size     00000000 (0)\n+04F7F Filename Length       003C (60)\n+04F81 Extra Length          0009 (9)\n+04F83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x4F83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+04FBF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+04FC1   Length              0005 (5)\n+04FC3   Flags               01 (1) 'Modification'\n+04FC4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+04FC8 PAYLOAD\n+\n+05630 DATA DESCRIPTOR       08074B50 (134695760)\n+05634 CRC                   5B9C99AA (1536989610)\n+05638 Compressed Size       00000668 (1640)\n+0563C Uncompressed Size     00000668 (1640)\n+\n+05640 LOCAL HEADER #21      04034B50 (67324752)\n+05644 Extract Zip Spec      14 (20) '2.0'\n+05645 Extract OS            00 (0) 'MS-DOS'\n+05646 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+05648 Compression Method    0000 (0) 'Stored'\n+0564A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0564E CRC                   00000000 (0)\n+05652 Compressed Size       00000000 (0)\n+05656 Uncompressed Size     00000000 (0)\n+0565A Filename Length       0035 (53)\n+0565C Extra Length          0009 (9)\n+0565E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x565E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+05693 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+05695   Length              0005 (5)\n+05697   Flags               01 (1) 'Modification'\n+05698   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0569C PAYLOAD\n+\n+060C6 DATA DESCRIPTOR       08074B50 (134695760)\n+060CA CRC                   050B43B2 (84624306)\n+060CE Compressed Size       00000A2A (2602)\n+060D2 Uncompressed Size     00000A2A (2602)\n+\n+060D6 LOCAL HEADER #22      04034B50 (67324752)\n+060DA Extract Zip Spec      14 (20) '2.0'\n+060DB Extract OS            00 (0) 'MS-DOS'\n+060DC General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+060DE Compression Method    0000 (0) 'Stored'\n+060E0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+060E4 CRC                   00000000 (0)\n+060E8 Compressed Size       00000000 (0)\n+060EC Uncompressed Size     00000000 (0)\n+060F0 Filename Length       0034 (52)\n+060F2 Extra Length          0009 (9)\n+060F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x60F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+06128 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0612A   Length              0005 (5)\n+0612C   Flags               01 (1) 'Modification'\n+0612D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+06131 PAYLOAD\n+\n+09B30 DATA DESCRIPTOR       08074B50 (134695760)\n+09B34 CRC                   C548D865 (3309885541)\n+09B38 Compressed Size       000039FF (14847)\n+09B3C Uncompressed Size     000039FF (14847)\n+\n+09B40 LOCAL HEADER #23      04034B50 (67324752)\n+09B44 Extract Zip Spec      14 (20) '2.0'\n+09B45 Extract OS            00 (0) 'MS-DOS'\n+09B46 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+09B48 Compression Method    0000 (0) 'Stored'\n+09B4A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+09B4E CRC                   00000000 (0)\n+09B52 Compressed Size       00000000 (0)\n+09B56 Uncompressed Size     00000000 (0)\n+09B5A Filename Length       003B (59)\n+09B5C Extra Length          0009 (9)\n+09B5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x9B5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+09B99 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+09B9B   Length              0005 (5)\n+09B9D   Flags               01 (1) 'Modification'\n+09B9E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+09BA2 PAYLOAD\n+\n+0A093 DATA DESCRIPTOR       08074B50 (134695760)\n+0A097 CRC                   F93C1E65 (4181466725)\n+0A09B Compressed Size       000004F1 (1265)\n+0A09F Uncompressed Size     000004F1 (1265)\n+\n+0A0A3 LOCAL HEADER #24      04034B50 (67324752)\n+0A0A7 Extract Zip Spec      14 (20) '2.0'\n+0A0A8 Extract OS            00 (0) 'MS-DOS'\n+0A0A9 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0A0AB Compression Method    0000 (0) 'Stored'\n+0A0AD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0A0B1 CRC                   00000000 (0)\n+0A0B5 Compressed Size       00000000 (0)\n+0A0B9 Uncompressed Size     00000000 (0)\n+0A0BD Filename Length       003C (60)\n+0A0BF Extra Length          0009 (9)\n+0A0C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xA0C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0A0FD Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0A0FF   Length              0005 (5)\n+0A101   Flags               01 (1) 'Modification'\n+0A102   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0A106 PAYLOAD\n+\n+0EA64 DATA DESCRIPTOR       08074B50 (134695760)\n+0EA68 CRC                   1758261F (391652895)\n+0EA6C Compressed Size       0000495E (18782)\n+0EA70 Uncompressed Size     0000495E (18782)\n+\n+0EA74 LOCAL HEADER #25      04034B50 (67324752)\n+0EA78 Extract Zip Spec      14 (20) '2.0'\n+0EA79 Extract OS            00 (0) 'MS-DOS'\n+0EA7A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0EA7C Compression Method    0000 (0) 'Stored'\n+0EA7E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0EA82 CRC                   00000000 (0)\n+0EA86 Compressed Size       00000000 (0)\n+0EA8A Uncompressed Size     00000000 (0)\n+0EA8E Filename Length       0043 (67)\n+0EA90 Extra Length          0009 (9)\n+0EA92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xEA92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0EAD5 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0EAD7   Length              0005 (5)\n+0EAD9   Flags               01 (1) 'Modification'\n+0EADA   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0EADE PAYLOAD\n+\n+0EFCD DATA DESCRIPTOR       08074B50 (134695760)\n+0EFD1 CRC                   09B44E50 (162811472)\n+0EFD5 Compressed Size       000004EF (1263)\n+0EFD9 Uncompressed Size     000004EF (1263)\n+\n+0EFDD LOCAL HEADER #26      04034B50 (67324752)\n+0EFE1 Extract Zip Spec      14 (20) '2.0'\n+0EFE2 Extract OS            00 (0) 'MS-DOS'\n+0EFE3 General Purpose Flag  0808 (2056)\n       [Bit  3]              1 'Streamed'\n       [Bit 11]              1 'Language Encoding'\n-0EC0D Compression Method    0000 (0) 'Stored'\n-0EC0F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0EC13 CRC                   00000000 (0)\n-0EC17 Compressed Size       00000000 (0)\n-0EC1B Uncompressed Size     00000000 (0)\n-0EC1F Filename Length       0048 (72)\n-0EC21 Extra Length          0009 (9)\n-0EC23 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xEC23: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0EC6B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0EC6D   Length              0005 (5)\n-0EC6F   Flags               01 (1) 'Modification'\n-0EC70   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0EC74 PAYLOAD\n-\n-0F145 DATA DESCRIPTOR       08074B50 (134695760)\n-0F149 CRC                   35541C2F (894704687)\n-0F14D Compressed Size       000004D1 (1233)\n-0F151 Uncompressed Size     000004D1 (1233)\n-\n-0F155 LOCAL HEADER #27      04034B50 (67324752)\n-0F159 Extract Zip Spec      14 (20) '2.0'\n-0F15A Extract OS            00 (0) 'MS-DOS'\n-0F15B General Purpose Flag  0808 (2056)\n+0EFE5 Compression Method    0000 (0) 'Stored'\n+0EFE7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0EFEB CRC                   00000000 (0)\n+0EFEF Compressed Size       00000000 (0)\n+0EFF3 Uncompressed Size     00000000 (0)\n+0EFF7 Filename Length       0048 (72)\n+0EFF9 Extra Length          0009 (9)\n+0EFFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xEFFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0F043 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0F045   Length              0005 (5)\n+0F047   Flags               01 (1) 'Modification'\n+0F048   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0F04C PAYLOAD\n+\n+0F53B DATA DESCRIPTOR       08074B50 (134695760)\n+0F53F CRC                   09B44E50 (162811472)\n+0F543 Compressed Size       000004EF (1263)\n+0F547 Uncompressed Size     000004EF (1263)\n+\n+0F54B LOCAL HEADER #27      04034B50 (67324752)\n+0F54F Extract Zip Spec      14 (20) '2.0'\n+0F550 Extract OS            00 (0) 'MS-DOS'\n+0F551 General Purpose Flag  0808 (2056)\n       [Bit  3]              1 'Streamed'\n       [Bit 11]              1 'Language Encoding'\n-0F15D Compression Method    0000 (0) 'Stored'\n-0F15F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F163 CRC                   00000000 (0)\n-0F167 Compressed Size       00000000 (0)\n-0F16B Uncompressed Size     00000000 (0)\n-0F16F Filename Length       0050 (80)\n-0F171 Extra Length          0009 (9)\n-0F173 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF173: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F1C3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F1C5   Length              0005 (5)\n-0F1C7   Flags               01 (1) 'Modification'\n-0F1C8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-0F1CC PAYLOAD\n-\n-0F69D DATA DESCRIPTOR       08074B50 (134695760)\n-0F6A1 CRC                   35541C2F (894704687)\n-0F6A5 Compressed Size       000004D1 (1233)\n-0F6A9 Uncompressed Size     000004D1 (1233)\n-\n-0F6AD CENTRAL HEADER #1     02014B50 (33639248)\n-0F6B1 Created Zip Spec      14 (20) '2.0'\n-0F6B2 Created OS            00 (0) 'MS-DOS'\n-0F6B3 Extract Zip Spec      14 (20) '2.0'\n-0F6B4 Extract OS            00 (0) 'MS-DOS'\n-0F6B5 General Purpose Flag  0000 (0)\n-0F6B7 Compression Method    0000 (0) 'Stored'\n-0F6B9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F6BD CRC                   00000000 (0)\n-0F6C1 Compressed Size       00000000 (0)\n-0F6C5 Uncompressed Size     00000000 (0)\n-0F6C9 Filename Length       0009 (9)\n-0F6CB Extra Length          0009 (9)\n-0F6CD Comment Length        0000 (0)\n-0F6CF Disk Start            0000 (0)\n-0F6D1 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F6D3 Ext File Attributes   00000000 (0)\n-0F6D7 Local Header Offset   00000000 (0)\n-0F6DB Filename              'XXXXXXXXX'\n-#\n-# WARNING: Offset 0xF6DB: Filename 'XXXXXXXXX'\n-#          Zero length filename\n-#\n-0F6E4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F6E6   Length              0005 (5)\n-0F6E8   Flags               01 (1) 'Modification'\n-0F6E9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F6ED CENTRAL HEADER #2     02014B50 (33639248)\n-0F6F1 Created Zip Spec      14 (20) '2.0'\n-0F6F2 Created OS            00 (0) 'MS-DOS'\n-0F6F3 Extract Zip Spec      14 (20) '2.0'\n-0F6F4 Extract OS            00 (0) 'MS-DOS'\n-0F6F5 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F6F7 Compression Method    0000 (0) 'Stored'\n-0F6F9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F6FD CRC                   CDF3DBFF (3455310847)\n-0F701 Compressed Size       000012B8 (4792)\n-0F705 Uncompressed Size     000012B8 (4792)\n-0F709 Filename Length       0015 (21)\n-0F70B Extra Length          0009 (9)\n-0F70D Comment Length        0000 (0)\n-0F70F Disk Start            0000 (0)\n-0F711 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F713 Ext File Attributes   00000000 (0)\n-0F717 Local Header Offset   00000030 (48)\n-0F71B Filename              'XXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF71B: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F730 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F732   Length              0005 (5)\n-0F734   Flags               01 (1) 'Modification'\n-0F735   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F739 CENTRAL HEADER #3     02014B50 (33639248)\n-0F73D Created Zip Spec      14 (20) '2.0'\n-0F73E Created OS            00 (0) 'MS-DOS'\n-0F73F Extract Zip Spec      14 (20) '2.0'\n-0F740 Extract OS            00 (0) 'MS-DOS'\n-0F741 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F743 Compression Method    0000 (0) 'Stored'\n-0F745 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F749 CRC                   86E2B4B4 (2263004340)\n-0F74D Compressed Size       00002C5E (11358)\n-0F751 Uncompressed Size     00002C5E (11358)\n-0F755 Filename Length       0010 (16)\n-0F757 Extra Length          0009 (9)\n-0F759 Comment Length        0000 (0)\n-0F75B Disk Start            0000 (0)\n-0F75D Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F75F Ext File Attributes   00000000 (0)\n-0F763 Local Header Offset   00001334 (4916)\n-0F767 Filename              'XXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF767: Filename 'XXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F777 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F779   Length              0005 (5)\n-0F77B   Flags               01 (1) 'Modification'\n-0F77C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F780 CENTRAL HEADER #4     02014B50 (33639248)\n-0F784 Created Zip Spec      14 (20) '2.0'\n-0F785 Created OS            00 (0) 'MS-DOS'\n-0F786 Extract Zip Spec      14 (20) '2.0'\n-0F787 Extract OS            00 (0) 'MS-DOS'\n-0F788 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F78A Compression Method    0000 (0) 'Stored'\n-0F78C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F790 CRC                   EE027FB2 (3993141170)\n-0F794 Compressed Size       00000019 (25)\n-0F798 Uncompressed Size     00000019 (25)\n-0F79C Filename Length       0014 (20)\n-0F79E Extra Length          0009 (9)\n-0F7A0 Comment Length        0000 (0)\n-0F7A2 Disk Start            0000 (0)\n-0F7A4 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F7A6 Ext File Attributes   00000000 (0)\n-0F7AA Local Header Offset   00003FD9 (16345)\n-0F7AE Filename              'XXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF7AE: Filename 'XXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F7C2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F7C4   Length              0005 (5)\n-0F7C6   Flags               01 (1) 'Modification'\n-0F7C7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F7CB CENTRAL HEADER #5     02014B50 (33639248)\n-0F7CF Created Zip Spec      14 (20) '2.0'\n-0F7D0 Created OS            00 (0) 'MS-DOS'\n-0F7D1 Extract Zip Spec      14 (20) '2.0'\n-0F7D2 Extract OS            00 (0) 'MS-DOS'\n-0F7D3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F7D5 Compression Method    0000 (0) 'Stored'\n-0F7D7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F7DB CRC                   E5A5E730 (3852855088)\n-0F7DF Compressed Size       000000B2 (178)\n-0F7E3 Uncompressed Size     000000B2 (178)\n-0F7E7 Filename Length       000F (15)\n-0F7E9 Extra Length          0009 (9)\n-0F7EB Comment Length        0000 (0)\n-0F7ED Disk Start            0000 (0)\n-0F7EF Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F7F1 Ext File Attributes   00000000 (0)\n-0F7F5 Local Header Offset   0000403D (16445)\n-0F7F9 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF7F9: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F808 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F80A   Length              0005 (5)\n-0F80C   Flags               01 (1) 'Modification'\n-0F80D   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F811 CENTRAL HEADER #6     02014B50 (33639248)\n-0F815 Created Zip Spec      14 (20) '2.0'\n-0F816 Created OS            00 (0) 'MS-DOS'\n-0F817 Extract Zip Spec      14 (20) '2.0'\n-0F818 Extract OS            00 (0) 'MS-DOS'\n-0F819 General Purpose Flag  0000 (0)\n-0F81B Compression Method    0000 (0) 'Stored'\n-0F81D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F821 CRC                   00000000 (0)\n-0F825 Compressed Size       00000000 (0)\n-0F829 Uncompressed Size     00000000 (0)\n-0F82D Filename Length       000F (15)\n-0F82F Extra Length          0009 (9)\n-0F831 Comment Length        0000 (0)\n-0F833 Disk Start            0000 (0)\n-0F835 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F837 Ext File Attributes   00000000 (0)\n-0F83B Local Header Offset   00004135 (16693)\n-0F83F Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF83F: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F84E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F850   Length              0005 (5)\n-0F852   Flags               01 (1) 'Modification'\n-0F853   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F857 CENTRAL HEADER #7     02014B50 (33639248)\n-0F85B Created Zip Spec      14 (20) '2.0'\n-0F85C Created OS            00 (0) 'MS-DOS'\n-0F85D Extract Zip Spec      14 (20) '2.0'\n-0F85E Extract OS            00 (0) 'MS-DOS'\n-0F85F General Purpose Flag  0000 (0)\n-0F861 Compression Method    0000 (0) 'Stored'\n-0F863 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F867 CRC                   00000000 (0)\n-0F86B Compressed Size       00000000 (0)\n-0F86F Uncompressed Size     00000000 (0)\n-0F873 Filename Length       0018 (24)\n-0F875 Extra Length          0009 (9)\n-0F877 Comment Length        0000 (0)\n-0F879 Disk Start            0000 (0)\n-0F87B Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F87D Ext File Attributes   00000000 (0)\n-0F881 Local Header Offset   0000416B (16747)\n-0F885 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF885: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F89D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F89F   Length              0005 (5)\n-0F8A1   Flags               01 (1) 'Modification'\n-0F8A2   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F8A6 CENTRAL HEADER #8     02014B50 (33639248)\n-0F8AA Created Zip Spec      14 (20) '2.0'\n-0F8AB Created OS            00 (0) 'MS-DOS'\n-0F8AC Extract Zip Spec      14 (20) '2.0'\n-0F8AD Extract OS            00 (0) 'MS-DOS'\n-0F8AE General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F8B0 Compression Method    0000 (0) 'Stored'\n-0F8B2 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F8B6 CRC                   8BCE1404 (2345538564)\n-0F8BA Compressed Size       0000003F (63)\n-0F8BE Uncompressed Size     0000003F (63)\n-0F8C2 Filename Length       0041 (65)\n-0F8C4 Extra Length          0009 (9)\n-0F8C6 Comment Length        0000 (0)\n-0F8C8 Disk Start            0000 (0)\n-0F8CA Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F8CC Ext File Attributes   00000000 (0)\n-0F8D0 Local Header Offset   000041AA (16810)\n-0F8D4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF8D4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F915 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F917   Length              0005 (5)\n-0F919   Flags               01 (1) 'Modification'\n-0F91A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F91E CENTRAL HEADER #9     02014B50 (33639248)\n-0F922 Created Zip Spec      14 (20) '2.0'\n-0F923 Created OS            00 (0) 'MS-DOS'\n-0F924 Extract Zip Spec      14 (20) '2.0'\n-0F925 Extract OS            00 (0) 'MS-DOS'\n-0F926 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0F928 Compression Method    0000 (0) 'Stored'\n-0F92A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F92E CRC                   FA6D0539 (4201448761)\n-0F932 Compressed Size       00000045 (69)\n-0F936 Uncompressed Size     00000045 (69)\n-0F93A Filename Length       0050 (80)\n-0F93C Extra Length          0009 (9)\n-0F93E Comment Length        0000 (0)\n-0F940 Disk Start            0000 (0)\n-0F942 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F944 Ext File Attributes   00000000 (0)\n-0F948 Local Header Offset   00004261 (16993)\n-0F94C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF94C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F99C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F99E   Length              0005 (5)\n-0F9A0   Flags               01 (1) 'Modification'\n-0F9A1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F9A5 CENTRAL HEADER #10    02014B50 (33639248)\n-0F9A9 Created Zip Spec      14 (20) '2.0'\n-0F9AA Created OS            00 (0) 'MS-DOS'\n-0F9AB Extract Zip Spec      14 (20) '2.0'\n-0F9AC Extract OS            00 (0) 'MS-DOS'\n-0F9AD General Purpose Flag  0000 (0)\n-0F9AF Compression Method    0000 (0) 'Stored'\n-0F9B1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F9B5 CRC                   00000000 (0)\n-0F9B9 Compressed Size       00000000 (0)\n-0F9BD Uncompressed Size     00000000 (0)\n-0F9C1 Filename Length       000F (15)\n-0F9C3 Extra Length          0009 (9)\n-0F9C5 Comment Length        0000 (0)\n-0F9C7 Disk Start            0000 (0)\n-0F9C9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0F9CB Ext File Attributes   00000000 (0)\n-0F9CF Local Header Offset   0000432D (17197)\n-0F9D3 Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xF9D3: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0F9E2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0F9E4   Length              0005 (5)\n-0F9E6   Flags               01 (1) 'Modification'\n-0F9E7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0F9EB CENTRAL HEADER #11    02014B50 (33639248)\n-0F9EF Created Zip Spec      14 (20) '2.0'\n-0F9F0 Created OS            00 (0) 'MS-DOS'\n-0F9F1 Extract Zip Spec      14 (20) '2.0'\n-0F9F2 Extract OS            00 (0) 'MS-DOS'\n-0F9F3 General Purpose Flag  0000 (0)\n-0F9F5 Compression Method    0000 (0) 'Stored'\n-0F9F7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0F9FB CRC                   00000000 (0)\n-0F9FF Compressed Size       00000000 (0)\n-0FA03 Uncompressed Size     00000000 (0)\n-0FA07 Filename Length       0020 (32)\n-0FA09 Extra Length          0009 (9)\n-0FA0B Comment Length        0000 (0)\n-0FA0D Disk Start            0000 (0)\n-0FA0F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FA11 Ext File Attributes   00000000 (0)\n-0FA15 Local Header Offset   00004363 (17251)\n-0FA19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFA19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FA39 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FA3B   Length              0005 (5)\n-0FA3D   Flags               01 (1) 'Modification'\n-0FA3E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FA42 CENTRAL HEADER #12    02014B50 (33639248)\n-0FA46 Created Zip Spec      14 (20) '2.0'\n-0FA47 Created OS            00 (0) 'MS-DOS'\n-0FA48 Extract Zip Spec      14 (20) '2.0'\n-0FA49 Extract OS            00 (0) 'MS-DOS'\n-0FA4A General Purpose Flag  0000 (0)\n-0FA4C Compression Method    0000 (0) 'Stored'\n-0FA4E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FA52 CRC                   00000000 (0)\n-0FA56 Compressed Size       00000000 (0)\n-0FA5A Uncompressed Size     00000000 (0)\n-0FA5E Filename Length       0036 (54)\n-0FA60 Extra Length          0009 (9)\n-0FA62 Comment Length        0000 (0)\n-0FA64 Disk Start            0000 (0)\n-0FA66 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FA68 Ext File Attributes   00000000 (0)\n-0FA6C Local Header Offset   000043AA (17322)\n-0FA70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFA70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FAA6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FAA8   Length              0005 (5)\n-0FAAA   Flags               01 (1) 'Modification'\n-0FAAB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FAAF CENTRAL HEADER #13    02014B50 (33639248)\n-0FAB3 Created Zip Spec      14 (20) '2.0'\n-0FAB4 Created OS            00 (0) 'MS-DOS'\n-0FAB5 Extract Zip Spec      14 (20) '2.0'\n-0FAB6 Extract OS            00 (0) 'MS-DOS'\n-0FAB7 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FAB9 Compression Method    0000 (0) 'Stored'\n-0FABB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FABF CRC                   00000000 (0)\n-0FAC3 Compressed Size       00000000 (0)\n-0FAC7 Uncompressed Size     00000000 (0)\n-0FACB Filename Length       0044 (68)\n-0FACD Extra Length          0009 (9)\n-0FACF Comment Length        0000 (0)\n-0FAD1 Disk Start            0000 (0)\n-0FAD3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FAD5 Ext File Attributes   00000000 (0)\n-0FAD9 Local Header Offset   00004407 (17415)\n-0FADD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFADD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FB21 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FB23   Length              0005 (5)\n-0FB25   Flags               01 (1) 'Modification'\n-0FB26   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FB2A CENTRAL HEADER #14    02014B50 (33639248)\n-0FB2E Created Zip Spec      14 (20) '2.0'\n-0FB2F Created OS            00 (0) 'MS-DOS'\n-0FB30 Extract Zip Spec      14 (20) '2.0'\n-0FB31 Extract OS            00 (0) 'MS-DOS'\n-0FB32 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FB34 Compression Method    0000 (0) 'Stored'\n-0FB36 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FB3A CRC                   178839D9 (394803673)\n-0FB3E Compressed Size       00000992 (2450)\n-0FB42 Uncompressed Size     00000992 (2450)\n-0FB46 Filename Length       003D (61)\n-0FB48 Extra Length          0009 (9)\n-0FB4A Comment Length        0000 (0)\n-0FB4C Disk Start            0000 (0)\n-0FB4E Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FB50 Ext File Attributes   00000000 (0)\n-0FB54 Local Header Offset   00004482 (17538)\n-0FB58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFB58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FB95 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FB97   Length              0005 (5)\n-0FB99   Flags               01 (1) 'Modification'\n-0FB9A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FB9E CENTRAL HEADER #15    02014B50 (33639248)\n-0FBA2 Created Zip Spec      14 (20) '2.0'\n-0FBA3 Created OS            00 (0) 'MS-DOS'\n-0FBA4 Extract Zip Spec      14 (20) '2.0'\n-0FBA5 Extract OS            00 (0) 'MS-DOS'\n-0FBA6 General Purpose Flag  0000 (0)\n-0FBA8 Compression Method    0000 (0) 'Stored'\n-0FBAA Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FBAE CRC                   00000000 (0)\n-0FBB2 Compressed Size       00000000 (0)\n-0FBB6 Uncompressed Size     00000000 (0)\n-0FBBA Filename Length       0004 (4)\n-0FBBC Extra Length          0009 (9)\n-0FBBE Comment Length        0000 (0)\n-0FBC0 Disk Start            0000 (0)\n-0FBC2 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FBC4 Ext File Attributes   00000000 (0)\n-0FBC8 Local Header Offset   00004E88 (20104)\n-0FBCC Filename              'XXXX'\n-#\n-# WARNING: Offset 0xFBCC: Filename 'XXXX'\n-#          Zero length filename\n-#\n-0FBD0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FBD2   Length              0005 (5)\n-0FBD4   Flags               01 (1) 'Modification'\n-0FBD5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FBD9 CENTRAL HEADER #16    02014B50 (33639248)\n-0FBDD Created Zip Spec      14 (20) '2.0'\n-0FBDE Created OS            00 (0) 'MS-DOS'\n-0FBDF Extract Zip Spec      14 (20) '2.0'\n-0FBE0 Extract OS            00 (0) 'MS-DOS'\n-0FBE1 General Purpose Flag  0000 (0)\n-0FBE3 Compression Method    0000 (0) 'Stored'\n-0FBE5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FBE9 CRC                   00000000 (0)\n-0FBED Compressed Size       00000000 (0)\n-0FBF1 Uncompressed Size     00000000 (0)\n-0FBF5 Filename Length       000B (11)\n-0FBF7 Extra Length          0009 (9)\n-0FBF9 Comment Length        0000 (0)\n-0FBFB Disk Start            0000 (0)\n-0FBFD Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FBFF Ext File Attributes   00000000 (0)\n-0FC03 Local Header Offset   00004EB3 (20147)\n-0FC07 Filename              'XXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFC07: Filename 'XXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FC12 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FC14   Length              0005 (5)\n-0FC16   Flags               01 (1) 'Modification'\n-0FC17   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FC1B CENTRAL HEADER #17    02014B50 (33639248)\n-0FC1F Created Zip Spec      14 (20) '2.0'\n-0FC20 Created OS            00 (0) 'MS-DOS'\n-0FC21 Extract Zip Spec      14 (20) '2.0'\n-0FC22 Extract OS            00 (0) 'MS-DOS'\n-0FC23 General Purpose Flag  0000 (0)\n-0FC25 Compression Method    0000 (0) 'Stored'\n-0FC27 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FC2B CRC                   00000000 (0)\n-0FC2F Compressed Size       00000000 (0)\n-0FC33 Uncompressed Size     00000000 (0)\n-0FC37 Filename Length       0011 (17)\n-0FC39 Extra Length          0009 (9)\n-0FC3B Comment Length        0000 (0)\n-0FC3D Disk Start            0000 (0)\n-0FC3F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FC41 Ext File Attributes   00000000 (0)\n-0FC45 Local Header Offset   00004EE5 (20197)\n-0FC49 Filename              'XXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFC49: Filename 'XXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FC5A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FC5C   Length              0005 (5)\n-0FC5E   Flags               01 (1) 'Modification'\n-0FC5F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FC63 CENTRAL HEADER #18    02014B50 (33639248)\n-0FC67 Created Zip Spec      14 (20) '2.0'\n-0FC68 Created OS            00 (0) 'MS-DOS'\n-0FC69 Extract Zip Spec      14 (20) '2.0'\n-0FC6A Extract OS            00 (0) 'MS-DOS'\n-0FC6B General Purpose Flag  0000 (0)\n-0FC6D Compression Method    0000 (0) 'Stored'\n-0FC6F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FC73 CRC                   00000000 (0)\n-0FC77 Compressed Size       00000000 (0)\n-0FC7B Uncompressed Size     00000000 (0)\n-0FC7F Filename Length       001A (26)\n-0FC81 Extra Length          0009 (9)\n-0FC83 Comment Length        0000 (0)\n-0FC85 Disk Start            0000 (0)\n-0FC87 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FC89 Ext File Attributes   00000000 (0)\n-0FC8D Local Header Offset   00004F1D (20253)\n-0FC91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFC91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FCAB Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FCAD   Length              0005 (5)\n-0FCAF   Flags               01 (1) 'Modification'\n-0FCB0   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FCB4 CENTRAL HEADER #19    02014B50 (33639248)\n-0FCB8 Created Zip Spec      14 (20) '2.0'\n-0FCB9 Created OS            00 (0) 'MS-DOS'\n-0FCBA Extract Zip Spec      14 (20) '2.0'\n-0FCBB Extract OS            00 (0) 'MS-DOS'\n-0FCBC General Purpose Flag  0000 (0)\n-0FCBE Compression Method    0000 (0) 'Stored'\n-0FCC0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FCC4 CRC                   00000000 (0)\n-0FCC8 Compressed Size       00000000 (0)\n-0FCCC Uncompressed Size     00000000 (0)\n-0FCD0 Filename Length       0021 (33)\n-0FCD2 Extra Length          0009 (9)\n-0FCD4 Comment Length        0000 (0)\n-0FCD6 Disk Start            0000 (0)\n-0FCD8 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FCDA Ext File Attributes   00000000 (0)\n-0FCDE Local Header Offset   00004F5E (20318)\n-0FCE2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFCE2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FD03 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FD05   Length              0005 (5)\n-0FD07   Flags               01 (1) 'Modification'\n-0FD08   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FD0C CENTRAL HEADER #20    02014B50 (33639248)\n-0FD10 Created Zip Spec      14 (20) '2.0'\n-0FD11 Created OS            00 (0) 'MS-DOS'\n-0FD12 Extract Zip Spec      14 (20) '2.0'\n-0FD13 Extract OS            00 (0) 'MS-DOS'\n-0FD14 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FD16 Compression Method    0000 (0) 'Stored'\n-0FD18 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FD1C CRC                   DD92E439 (3717391417)\n-0FD20 Compressed Size       00000641 (1601)\n-0FD24 Uncompressed Size     00000641 (1601)\n-0FD28 Filename Length       003C (60)\n-0FD2A Extra Length          0009 (9)\n-0FD2C Comment Length        0000 (0)\n-0FD2E Disk Start            0000 (0)\n-0FD30 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FD32 Ext File Attributes   00000000 (0)\n-0FD36 Local Header Offset   00004FA6 (20390)\n-0FD3A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFD3A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FD76 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FD78   Length              0005 (5)\n-0FD7A   Flags               01 (1) 'Modification'\n-0FD7B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FD7F CENTRAL HEADER #21    02014B50 (33639248)\n-0FD83 Created Zip Spec      14 (20) '2.0'\n-0FD84 Created OS            00 (0) 'MS-DOS'\n-0FD85 Extract Zip Spec      14 (20) '2.0'\n-0FD86 Extract OS            00 (0) 'MS-DOS'\n-0FD87 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FD89 Compression Method    0000 (0) 'Stored'\n-0FD8B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FD8F CRC                   1FAE29F0 (531507696)\n-0FD93 Compressed Size       000009D3 (2515)\n-0FD97 Uncompressed Size     000009D3 (2515)\n-0FD9B Filename Length       0035 (53)\n-0FD9D Extra Length          0009 (9)\n-0FD9F Comment Length        0000 (0)\n-0FDA1 Disk Start            0000 (0)\n-0FDA3 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FDA5 Ext File Attributes   00000000 (0)\n-0FDA9 Local Header Offset   0000565A (22106)\n-0FDAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFDAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FDE2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FDE4   Length              0005 (5)\n-0FDE6   Flags               01 (1) 'Modification'\n-0FDE7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FDEB CENTRAL HEADER #22    02014B50 (33639248)\n-0FDEF Created Zip Spec      14 (20) '2.0'\n-0FDF0 Created OS            00 (0) 'MS-DOS'\n-0FDF1 Extract Zip Spec      14 (20) '2.0'\n-0FDF2 Extract OS            00 (0) 'MS-DOS'\n-0FDF3 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FDF5 Compression Method    0000 (0) 'Stored'\n-0FDF7 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FDFB CRC                   CF695E4A (3479789130)\n-0FDFF Compressed Size       00003883 (14467)\n-0FE03 Uncompressed Size     00003883 (14467)\n-0FE07 Filename Length       0034 (52)\n-0FE09 Extra Length          0009 (9)\n-0FE0B Comment Length        0000 (0)\n-0FE0D Disk Start            0000 (0)\n-0FE0F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FE11 Ext File Attributes   00000000 (0)\n-0FE15 Local Header Offset   00006099 (24729)\n-0FE19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F553 Compression Method    0000 (0) 'Stored'\n+0F555 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0F559 CRC                   00000000 (0)\n+0F55D Compressed Size       00000000 (0)\n+0F561 Uncompressed Size     00000000 (0)\n+0F565 Filename Length       0050 (80)\n+0F567 Extra Length          0009 (9)\n+0F569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xF569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0F5B9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0F5BB   Length              0005 (5)\n+0F5BD   Flags               01 (1) 'Modification'\n+0F5BE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+0F5C2 PAYLOAD\n+\n+0FAB1 DATA DESCRIPTOR       08074B50 (134695760)\n+0FAB5 CRC                   09B44E50 (162811472)\n+0FAB9 Compressed Size       000004EF (1263)\n+0FABD Uncompressed Size     000004EF (1263)\n+\n+0FAC1 CENTRAL HEADER #1     02014B50 (33639248)\n+0FAC5 Created Zip Spec      14 (20) '2.0'\n+0FAC6 Created OS            00 (0) 'MS-DOS'\n+0FAC7 Extract Zip Spec      14 (20) '2.0'\n+0FAC8 Extract OS            00 (0) 'MS-DOS'\n+0FAC9 General Purpose Flag  0000 (0)\n+0FACB Compression Method    0000 (0) 'Stored'\n+0FACD Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FAD1 CRC                   00000000 (0)\n+0FAD5 Compressed Size       00000000 (0)\n+0FAD9 Uncompressed Size     00000000 (0)\n+0FADD Filename Length       0009 (9)\n+0FADF Extra Length          0009 (9)\n+0FAE1 Comment Length        0000 (0)\n+0FAE3 Disk Start            0000 (0)\n+0FAE5 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FAE7 Ext File Attributes   00000000 (0)\n+0FAEB Local Header Offset   00000000 (0)\n+0FAEF Filename              'XXXXXXXXX'\n+#\n+# WARNING: Offset 0xFAEF: Filename 'XXXXXXXXX'\n+#          Zero length filename\n+#\n+0FAF8 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FAFA   Length              0005 (5)\n+0FAFC   Flags               01 (1) 'Modification'\n+0FAFD   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FB01 CENTRAL HEADER #2     02014B50 (33639248)\n+0FB05 Created Zip Spec      14 (20) '2.0'\n+0FB06 Created OS            00 (0) 'MS-DOS'\n+0FB07 Extract Zip Spec      14 (20) '2.0'\n+0FB08 Extract OS            00 (0) 'MS-DOS'\n+0FB09 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FB0B Compression Method    0000 (0) 'Stored'\n+0FB0D Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FB11 CRC                   CDF3DBFF (3455310847)\n+0FB15 Compressed Size       000012B8 (4792)\n+0FB19 Uncompressed Size     000012B8 (4792)\n+0FB1D Filename Length       0015 (21)\n+0FB1F Extra Length          0009 (9)\n+0FB21 Comment Length        0000 (0)\n+0FB23 Disk Start            0000 (0)\n+0FB25 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FB27 Ext File Attributes   00000000 (0)\n+0FB2B Local Header Offset   00000030 (48)\n+0FB2F Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFB2F: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FB44 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FB46   Length              0005 (5)\n+0FB48   Flags               01 (1) 'Modification'\n+0FB49   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FB4D CENTRAL HEADER #3     02014B50 (33639248)\n+0FB51 Created Zip Spec      14 (20) '2.0'\n+0FB52 Created OS            00 (0) 'MS-DOS'\n+0FB53 Extract Zip Spec      14 (20) '2.0'\n+0FB54 Extract OS            00 (0) 'MS-DOS'\n+0FB55 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FB57 Compression Method    0000 (0) 'Stored'\n+0FB59 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FB5D CRC                   86E2B4B4 (2263004340)\n+0FB61 Compressed Size       00002C5E (11358)\n+0FB65 Uncompressed Size     00002C5E (11358)\n+0FB69 Filename Length       0010 (16)\n+0FB6B Extra Length          0009 (9)\n+0FB6D Comment Length        0000 (0)\n+0FB6F Disk Start            0000 (0)\n+0FB71 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FB73 Ext File Attributes   00000000 (0)\n+0FB77 Local Header Offset   00001334 (4916)\n+0FB7B Filename              'XXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFB7B: Filename 'XXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FB8B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FB8D   Length              0005 (5)\n+0FB8F   Flags               01 (1) 'Modification'\n+0FB90   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FB94 CENTRAL HEADER #4     02014B50 (33639248)\n+0FB98 Created Zip Spec      14 (20) '2.0'\n+0FB99 Created OS            00 (0) 'MS-DOS'\n+0FB9A Extract Zip Spec      14 (20) '2.0'\n+0FB9B Extract OS            00 (0) 'MS-DOS'\n+0FB9C General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FB9E Compression Method    0000 (0) 'Stored'\n+0FBA0 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FBA4 CRC                   EE027FB2 (3993141170)\n+0FBA8 Compressed Size       00000019 (25)\n+0FBAC Uncompressed Size     00000019 (25)\n+0FBB0 Filename Length       0014 (20)\n+0FBB2 Extra Length          0009 (9)\n+0FBB4 Comment Length        0000 (0)\n+0FBB6 Disk Start            0000 (0)\n+0FBB8 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FBBA Ext File Attributes   00000000 (0)\n+0FBBE Local Header Offset   00003FD9 (16345)\n+0FBC2 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFBC2: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FBD6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FBD8   Length              0005 (5)\n+0FBDA   Flags               01 (1) 'Modification'\n+0FBDB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FBDF CENTRAL HEADER #5     02014B50 (33639248)\n+0FBE3 Created Zip Spec      14 (20) '2.0'\n+0FBE4 Created OS            00 (0) 'MS-DOS'\n+0FBE5 Extract Zip Spec      14 (20) '2.0'\n+0FBE6 Extract OS            00 (0) 'MS-DOS'\n+0FBE7 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FBE9 Compression Method    0000 (0) 'Stored'\n+0FBEB Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FBEF CRC                   E5A5E730 (3852855088)\n+0FBF3 Compressed Size       000000B2 (178)\n+0FBF7 Uncompressed Size     000000B2 (178)\n+0FBFB Filename Length       000F (15)\n+0FBFD Extra Length          0009 (9)\n+0FBFF Comment Length        0000 (0)\n+0FC01 Disk Start            0000 (0)\n+0FC03 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FC05 Ext File Attributes   00000000 (0)\n+0FC09 Local Header Offset   0000403D (16445)\n+0FC0D Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFC0D: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FC1C Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FC1E   Length              0005 (5)\n+0FC20   Flags               01 (1) 'Modification'\n+0FC21   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FC25 CENTRAL HEADER #6     02014B50 (33639248)\n+0FC29 Created Zip Spec      14 (20) '2.0'\n+0FC2A Created OS            00 (0) 'MS-DOS'\n+0FC2B Extract Zip Spec      14 (20) '2.0'\n+0FC2C Extract OS            00 (0) 'MS-DOS'\n+0FC2D General Purpose Flag  0000 (0)\n+0FC2F Compression Method    0000 (0) 'Stored'\n+0FC31 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FC35 CRC                   00000000 (0)\n+0FC39 Compressed Size       00000000 (0)\n+0FC3D Uncompressed Size     00000000 (0)\n+0FC41 Filename Length       000F (15)\n+0FC43 Extra Length          0009 (9)\n+0FC45 Comment Length        0000 (0)\n+0FC47 Disk Start            0000 (0)\n+0FC49 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FC4B Ext File Attributes   00000000 (0)\n+0FC4F Local Header Offset   00004135 (16693)\n+0FC53 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFC53: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FC62 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FC64   Length              0005 (5)\n+0FC66   Flags               01 (1) 'Modification'\n+0FC67   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FC6B CENTRAL HEADER #7     02014B50 (33639248)\n+0FC6F Created Zip Spec      14 (20) '2.0'\n+0FC70 Created OS            00 (0) 'MS-DOS'\n+0FC71 Extract Zip Spec      14 (20) '2.0'\n+0FC72 Extract OS            00 (0) 'MS-DOS'\n+0FC73 General Purpose Flag  0000 (0)\n+0FC75 Compression Method    0000 (0) 'Stored'\n+0FC77 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FC7B CRC                   00000000 (0)\n+0FC7F Compressed Size       00000000 (0)\n+0FC83 Uncompressed Size     00000000 (0)\n+0FC87 Filename Length       0018 (24)\n+0FC89 Extra Length          0009 (9)\n+0FC8B Comment Length        0000 (0)\n+0FC8D Disk Start            0000 (0)\n+0FC8F Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FC91 Ext File Attributes   00000000 (0)\n+0FC95 Local Header Offset   0000416B (16747)\n+0FC99 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFC99: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FCB1 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FCB3   Length              0005 (5)\n+0FCB5   Flags               01 (1) 'Modification'\n+0FCB6   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FCBA CENTRAL HEADER #8     02014B50 (33639248)\n+0FCBE Created Zip Spec      14 (20) '2.0'\n+0FCBF Created OS            00 (0) 'MS-DOS'\n+0FCC0 Extract Zip Spec      14 (20) '2.0'\n+0FCC1 Extract OS            00 (0) 'MS-DOS'\n+0FCC2 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FCC4 Compression Method    0000 (0) 'Stored'\n+0FCC6 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FCCA CRC                   8BCE1404 (2345538564)\n+0FCCE Compressed Size       0000003F (63)\n+0FCD2 Uncompressed Size     0000003F (63)\n+0FCD6 Filename Length       0041 (65)\n+0FCD8 Extra Length          0009 (9)\n+0FCDA Comment Length        0000 (0)\n+0FCDC Disk Start            0000 (0)\n+0FCDE Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FCE0 Ext File Attributes   00000000 (0)\n+0FCE4 Local Header Offset   000041AA (16810)\n+0FCE8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFCE8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FD29 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FD2B   Length              0005 (5)\n+0FD2D   Flags               01 (1) 'Modification'\n+0FD2E   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FD32 CENTRAL HEADER #9     02014B50 (33639248)\n+0FD36 Created Zip Spec      14 (20) '2.0'\n+0FD37 Created OS            00 (0) 'MS-DOS'\n+0FD38 Extract Zip Spec      14 (20) '2.0'\n+0FD39 Extract OS            00 (0) 'MS-DOS'\n+0FD3A General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FD3C Compression Method    0000 (0) 'Stored'\n+0FD3E Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FD42 CRC                   FA6D0539 (4201448761)\n+0FD46 Compressed Size       00000045 (69)\n+0FD4A Uncompressed Size     00000045 (69)\n+0FD4E Filename Length       0050 (80)\n+0FD50 Extra Length          0009 (9)\n+0FD52 Comment Length        0000 (0)\n+0FD54 Disk Start            0000 (0)\n+0FD56 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FD58 Ext File Attributes   00000000 (0)\n+0FD5C Local Header Offset   00004261 (16993)\n+0FD60 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFD60: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FDB0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FDB2   Length              0005 (5)\n+0FDB4   Flags               01 (1) 'Modification'\n+0FDB5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FDB9 CENTRAL HEADER #10    02014B50 (33639248)\n+0FDBD Created Zip Spec      14 (20) '2.0'\n+0FDBE Created OS            00 (0) 'MS-DOS'\n+0FDBF Extract Zip Spec      14 (20) '2.0'\n+0FDC0 Extract OS            00 (0) 'MS-DOS'\n+0FDC1 General Purpose Flag  0000 (0)\n+0FDC3 Compression Method    0000 (0) 'Stored'\n+0FDC5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FDC9 CRC                   00000000 (0)\n+0FDCD Compressed Size       00000000 (0)\n+0FDD1 Uncompressed Size     00000000 (0)\n+0FDD5 Filename Length       000F (15)\n+0FDD7 Extra Length          0009 (9)\n+0FDD9 Comment Length        0000 (0)\n+0FDDB Disk Start            0000 (0)\n+0FDDD Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FDDF Ext File Attributes   00000000 (0)\n+0FDE3 Local Header Offset   0000432D (17197)\n+0FDE7 Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFDE7: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FDF6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FDF8   Length              0005 (5)\n+0FDFA   Flags               01 (1) 'Modification'\n+0FDFB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FDFF CENTRAL HEADER #11    02014B50 (33639248)\n+0FE03 Created Zip Spec      14 (20) '2.0'\n+0FE04 Created OS            00 (0) 'MS-DOS'\n+0FE05 Extract Zip Spec      14 (20) '2.0'\n+0FE06 Extract OS            00 (0) 'MS-DOS'\n+0FE07 General Purpose Flag  0000 (0)\n+0FE09 Compression Method    0000 (0) 'Stored'\n+0FE0B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FE0F CRC                   00000000 (0)\n+0FE13 Compressed Size       00000000 (0)\n+0FE17 Uncompressed Size     00000000 (0)\n+0FE1B Filename Length       0020 (32)\n+0FE1D Extra Length          0009 (9)\n+0FE1F Comment Length        0000 (0)\n+0FE21 Disk Start            0000 (0)\n+0FE23 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FE25 Ext File Attributes   00000000 (0)\n+0FE29 Local Header Offset   00004363 (17251)\n+0FE2D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFE19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFE2D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 0FE4D Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n 0FE4F   Length              0005 (5)\n 0FE51   Flags               01 (1) 'Modification'\n 0FE52   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n \n-0FE56 CENTRAL HEADER #23    02014B50 (33639248)\n+0FE56 CENTRAL HEADER #12    02014B50 (33639248)\n 0FE5A Created Zip Spec      14 (20) '2.0'\n 0FE5B Created OS            00 (0) 'MS-DOS'\n 0FE5C Extract Zip Spec      14 (20) '2.0'\n 0FE5D Extract OS            00 (0) 'MS-DOS'\n-0FE5E General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n+0FE5E General Purpose Flag  0000 (0)\n 0FE60 Compression Method    0000 (0) 'Stored'\n 0FE62 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FE66 CRC                   EE6324FC (3999474940)\n-0FE6A Compressed Size       000004D1 (1233)\n-0FE6E Uncompressed Size     000004D1 (1233)\n-0FE72 Filename Length       003B (59)\n+0FE66 CRC                   00000000 (0)\n+0FE6A Compressed Size       00000000 (0)\n+0FE6E Uncompressed Size     00000000 (0)\n+0FE72 Filename Length       0036 (54)\n 0FE74 Extra Length          0009 (9)\n 0FE76 Comment Length        0000 (0)\n 0FE78 Disk Start            0000 (0)\n 0FE7A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n 0FE7C Ext File Attributes   00000000 (0)\n-0FE80 Local Header Offset   00009987 (39303)\n-0FE84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FE80 Local Header Offset   000043AA (17322)\n+0FE84 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFE84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFE84: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FEBF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FEC1   Length              0005 (5)\n-0FEC3   Flags               01 (1) 'Modification'\n-0FEC4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FEC8 CENTRAL HEADER #24    02014B50 (33639248)\n-0FECC Created Zip Spec      14 (20) '2.0'\n-0FECD Created OS            00 (0) 'MS-DOS'\n-0FECE Extract Zip Spec      14 (20) '2.0'\n-0FECF Extract OS            00 (0) 'MS-DOS'\n-0FED0 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FED2 Compression Method    0000 (0) 'Stored'\n-0FED4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FED8 CRC                   8A186986 (2316855686)\n-0FEDC Compressed Size       0000477D (18301)\n-0FEE0 Uncompressed Size     0000477D (18301)\n-0FEE4 Filename Length       003C (60)\n-0FEE6 Extra Length          0009 (9)\n-0FEE8 Comment Length        0000 (0)\n-0FEEA Disk Start            0000 (0)\n-0FEEC Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FEEE Ext File Attributes   00000000 (0)\n-0FEF2 Local Header Offset   00009ECA (40650)\n-0FEF6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFEF6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FF32 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FF34   Length              0005 (5)\n-0FF36   Flags               01 (1) 'Modification'\n-0FF37   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FF3B CENTRAL HEADER #25    02014B50 (33639248)\n-0FF3F Created Zip Spec      14 (20) '2.0'\n-0FF40 Created OS            00 (0) 'MS-DOS'\n-0FF41 Extract Zip Spec      14 (20) '2.0'\n-0FF42 Extract OS            00 (0) 'MS-DOS'\n-0FF43 General Purpose Flag  0008 (8)\n-      [Bit  3]              1 'Streamed'\n-0FF45 Compression Method    0000 (0) 'Stored'\n-0FF47 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FF4B CRC                   35541C2F (894704687)\n-0FF4F Compressed Size       000004D1 (1233)\n-0FF53 Uncompressed Size     000004D1 (1233)\n-0FF57 Filename Length       0043 (67)\n-0FF59 Extra Length          0009 (9)\n-0FF5B Comment Length        0000 (0)\n-0FF5D Disk Start            0000 (0)\n-0FF5F Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FF61 Ext File Attributes   00000000 (0)\n-0FF65 Local Header Offset   0000E6BA (59066)\n-0FF69 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFF69: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-0FFAC Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-0FFAE   Length              0005 (5)\n-0FFB0   Flags               01 (1) 'Modification'\n-0FFB1   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-0FFB5 CENTRAL HEADER #26    02014B50 (33639248)\n-0FFB9 Created Zip Spec      14 (20) '2.0'\n-0FFBA Created OS            00 (0) 'MS-DOS'\n-0FFBB Extract Zip Spec      14 (20) '2.0'\n-0FFBC Extract OS            00 (0) 'MS-DOS'\n-0FFBD General Purpose Flag  0808 (2056)\n+0FEBA Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FEBC   Length              0005 (5)\n+0FEBE   Flags               01 (1) 'Modification'\n+0FEBF   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FEC3 CENTRAL HEADER #13    02014B50 (33639248)\n+0FEC7 Created Zip Spec      14 (20) '2.0'\n+0FEC8 Created OS            00 (0) 'MS-DOS'\n+0FEC9 Extract Zip Spec      14 (20) '2.0'\n+0FECA Extract OS            00 (0) 'MS-DOS'\n+0FECB General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FECD Compression Method    0000 (0) 'Stored'\n+0FECF Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FED3 CRC                   00000000 (0)\n+0FED7 Compressed Size       00000000 (0)\n+0FEDB Uncompressed Size     00000000 (0)\n+0FEDF Filename Length       0044 (68)\n+0FEE1 Extra Length          0009 (9)\n+0FEE3 Comment Length        0000 (0)\n+0FEE5 Disk Start            0000 (0)\n+0FEE7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FEE9 Ext File Attributes   00000000 (0)\n+0FEED Local Header Offset   00004407 (17415)\n+0FEF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFEF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FF35 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FF37   Length              0005 (5)\n+0FF39   Flags               01 (1) 'Modification'\n+0FF3A   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FF3E CENTRAL HEADER #14    02014B50 (33639248)\n+0FF42 Created Zip Spec      14 (20) '2.0'\n+0FF43 Created OS            00 (0) 'MS-DOS'\n+0FF44 Extract Zip Spec      14 (20) '2.0'\n+0FF45 Extract OS            00 (0) 'MS-DOS'\n+0FF46 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+0FF48 Compression Method    0000 (0) 'Stored'\n+0FF4A Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FF4E CRC                   136E4489 (325993609)\n+0FF52 Compressed Size       00000951 (2385)\n+0FF56 Uncompressed Size     00000951 (2385)\n+0FF5A Filename Length       003D (61)\n+0FF5C Extra Length          0009 (9)\n+0FF5E Comment Length        0000 (0)\n+0FF60 Disk Start            0000 (0)\n+0FF62 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FF64 Ext File Attributes   00000000 (0)\n+0FF68 Local Header Offset   00004482 (17538)\n+0FF6C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0xFF6C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+0FFA9 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FFAB   Length              0005 (5)\n+0FFAD   Flags               01 (1) 'Modification'\n+0FFAE   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FFB2 CENTRAL HEADER #15    02014B50 (33639248)\n+0FFB6 Created Zip Spec      14 (20) '2.0'\n+0FFB7 Created OS            00 (0) 'MS-DOS'\n+0FFB8 Extract Zip Spec      14 (20) '2.0'\n+0FFB9 Extract OS            00 (0) 'MS-DOS'\n+0FFBA General Purpose Flag  0000 (0)\n+0FFBC Compression Method    0000 (0) 'Stored'\n+0FFBE Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FFC2 CRC                   00000000 (0)\n+0FFC6 Compressed Size       00000000 (0)\n+0FFCA Uncompressed Size     00000000 (0)\n+0FFCE Filename Length       0004 (4)\n+0FFD0 Extra Length          0009 (9)\n+0FFD2 Comment Length        0000 (0)\n+0FFD4 Disk Start            0000 (0)\n+0FFD6 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+0FFD8 Ext File Attributes   00000000 (0)\n+0FFDC Local Header Offset   00004E47 (20039)\n+0FFE0 Filename              'XXXX'\n+#\n+# WARNING: Offset 0xFFE0: Filename 'XXXX'\n+#          Zero length filename\n+#\n+0FFE4 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+0FFE6   Length              0005 (5)\n+0FFE8   Flags               01 (1) 'Modification'\n+0FFE9   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+0FFED CENTRAL HEADER #16    02014B50 (33639248)\n+0FFF1 Created Zip Spec      14 (20) '2.0'\n+0FFF2 Created OS            00 (0) 'MS-DOS'\n+0FFF3 Extract Zip Spec      14 (20) '2.0'\n+0FFF4 Extract OS            00 (0) 'MS-DOS'\n+0FFF5 General Purpose Flag  0000 (0)\n+0FFF7 Compression Method    0000 (0) 'Stored'\n+0FFF9 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+0FFFD CRC                   00000000 (0)\n+10001 Compressed Size       00000000 (0)\n+10005 Uncompressed Size     00000000 (0)\n+10009 Filename Length       000B (11)\n+1000B Extra Length          0009 (9)\n+1000D Comment Length        0000 (0)\n+1000F Disk Start            0000 (0)\n+10011 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10013 Ext File Attributes   00000000 (0)\n+10017 Local Header Offset   00004E72 (20082)\n+1001B Filename              'XXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1001B: Filename 'XXXXXXXXXXX'\n+#          Zero length filename\n+#\n+10026 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10028   Length              0005 (5)\n+1002A   Flags               01 (1) 'Modification'\n+1002B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1002F CENTRAL HEADER #17    02014B50 (33639248)\n+10033 Created Zip Spec      14 (20) '2.0'\n+10034 Created OS            00 (0) 'MS-DOS'\n+10035 Extract Zip Spec      14 (20) '2.0'\n+10036 Extract OS            00 (0) 'MS-DOS'\n+10037 General Purpose Flag  0000 (0)\n+10039 Compression Method    0000 (0) 'Stored'\n+1003B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1003F CRC                   00000000 (0)\n+10043 Compressed Size       00000000 (0)\n+10047 Uncompressed Size     00000000 (0)\n+1004B Filename Length       0011 (17)\n+1004D Extra Length          0009 (9)\n+1004F Comment Length        0000 (0)\n+10051 Disk Start            0000 (0)\n+10053 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10055 Ext File Attributes   00000000 (0)\n+10059 Local Header Offset   00004EA4 (20132)\n+1005D Filename              'XXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1005D: Filename 'XXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1006E Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10070   Length              0005 (5)\n+10072   Flags               01 (1) 'Modification'\n+10073   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+10077 CENTRAL HEADER #18    02014B50 (33639248)\n+1007B Created Zip Spec      14 (20) '2.0'\n+1007C Created OS            00 (0) 'MS-DOS'\n+1007D Extract Zip Spec      14 (20) '2.0'\n+1007E Extract OS            00 (0) 'MS-DOS'\n+1007F General Purpose Flag  0000 (0)\n+10081 Compression Method    0000 (0) 'Stored'\n+10083 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+10087 CRC                   00000000 (0)\n+1008B Compressed Size       00000000 (0)\n+1008F Uncompressed Size     00000000 (0)\n+10093 Filename Length       001A (26)\n+10095 Extra Length          0009 (9)\n+10097 Comment Length        0000 (0)\n+10099 Disk Start            0000 (0)\n+1009B Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1009D Ext File Attributes   00000000 (0)\n+100A1 Local Header Offset   00004EDC (20188)\n+100A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x100A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+100BF Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+100C1   Length              0005 (5)\n+100C3   Flags               01 (1) 'Modification'\n+100C4   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+100C8 CENTRAL HEADER #19    02014B50 (33639248)\n+100CC Created Zip Spec      14 (20) '2.0'\n+100CD Created OS            00 (0) 'MS-DOS'\n+100CE Extract Zip Spec      14 (20) '2.0'\n+100CF Extract OS            00 (0) 'MS-DOS'\n+100D0 General Purpose Flag  0000 (0)\n+100D2 Compression Method    0000 (0) 'Stored'\n+100D4 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+100D8 CRC                   00000000 (0)\n+100DC Compressed Size       00000000 (0)\n+100E0 Uncompressed Size     00000000 (0)\n+100E4 Filename Length       0021 (33)\n+100E6 Extra Length          0009 (9)\n+100E8 Comment Length        0000 (0)\n+100EA Disk Start            0000 (0)\n+100EC Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+100EE Ext File Attributes   00000000 (0)\n+100F2 Local Header Offset   00004F1D (20253)\n+100F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x100F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+10117 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10119   Length              0005 (5)\n+1011B   Flags               01 (1) 'Modification'\n+1011C   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+10120 CENTRAL HEADER #20    02014B50 (33639248)\n+10124 Created Zip Spec      14 (20) '2.0'\n+10125 Created OS            00 (0) 'MS-DOS'\n+10126 Extract Zip Spec      14 (20) '2.0'\n+10127 Extract OS            00 (0) 'MS-DOS'\n+10128 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1012A Compression Method    0000 (0) 'Stored'\n+1012C Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+10130 CRC                   5B9C99AA (1536989610)\n+10134 Compressed Size       00000668 (1640)\n+10138 Uncompressed Size     00000668 (1640)\n+1013C Filename Length       003C (60)\n+1013E Extra Length          0009 (9)\n+10140 Comment Length        0000 (0)\n+10142 Disk Start            0000 (0)\n+10144 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10146 Ext File Attributes   00000000 (0)\n+1014A Local Header Offset   00004F65 (20325)\n+1014E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1014E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1018A Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+1018C   Length              0005 (5)\n+1018E   Flags               01 (1) 'Modification'\n+1018F   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+10193 CENTRAL HEADER #21    02014B50 (33639248)\n+10197 Created Zip Spec      14 (20) '2.0'\n+10198 Created OS            00 (0) 'MS-DOS'\n+10199 Extract Zip Spec      14 (20) '2.0'\n+1019A Extract OS            00 (0) 'MS-DOS'\n+1019B General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+1019D Compression Method    0000 (0) 'Stored'\n+1019F Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+101A3 CRC                   050B43B2 (84624306)\n+101A7 Compressed Size       00000A2A (2602)\n+101AB Uncompressed Size     00000A2A (2602)\n+101AF Filename Length       0035 (53)\n+101B1 Extra Length          0009 (9)\n+101B3 Comment Length        0000 (0)\n+101B5 Disk Start            0000 (0)\n+101B7 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+101B9 Ext File Attributes   00000000 (0)\n+101BD Local Header Offset   00005640 (22080)\n+101C1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x101C1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+101F6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+101F8   Length              0005 (5)\n+101FA   Flags               01 (1) 'Modification'\n+101FB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+101FF CENTRAL HEADER #22    02014B50 (33639248)\n+10203 Created Zip Spec      14 (20) '2.0'\n+10204 Created OS            00 (0) 'MS-DOS'\n+10205 Extract Zip Spec      14 (20) '2.0'\n+10206 Extract OS            00 (0) 'MS-DOS'\n+10207 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+10209 Compression Method    0000 (0) 'Stored'\n+1020B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1020F CRC                   C548D865 (3309885541)\n+10213 Compressed Size       000039FF (14847)\n+10217 Uncompressed Size     000039FF (14847)\n+1021B Filename Length       0034 (52)\n+1021D Extra Length          0009 (9)\n+1021F Comment Length        0000 (0)\n+10221 Disk Start            0000 (0)\n+10223 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10225 Ext File Attributes   00000000 (0)\n+10229 Local Header Offset   000060D6 (24790)\n+1022D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1022D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+10261 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10263   Length              0005 (5)\n+10265   Flags               01 (1) 'Modification'\n+10266   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1026A CENTRAL HEADER #23    02014B50 (33639248)\n+1026E Created Zip Spec      14 (20) '2.0'\n+1026F Created OS            00 (0) 'MS-DOS'\n+10270 Extract Zip Spec      14 (20) '2.0'\n+10271 Extract OS            00 (0) 'MS-DOS'\n+10272 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+10274 Compression Method    0000 (0) 'Stored'\n+10276 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1027A CRC                   F93C1E65 (4181466725)\n+1027E Compressed Size       000004F1 (1265)\n+10282 Uncompressed Size     000004F1 (1265)\n+10286 Filename Length       003B (59)\n+10288 Extra Length          0009 (9)\n+1028A Comment Length        0000 (0)\n+1028C Disk Start            0000 (0)\n+1028E Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10290 Ext File Attributes   00000000 (0)\n+10294 Local Header Offset   00009B40 (39744)\n+10298 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x10298: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+102D3 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+102D5   Length              0005 (5)\n+102D7   Flags               01 (1) 'Modification'\n+102D8   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+102DC CENTRAL HEADER #24    02014B50 (33639248)\n+102E0 Created Zip Spec      14 (20) '2.0'\n+102E1 Created OS            00 (0) 'MS-DOS'\n+102E2 Extract Zip Spec      14 (20) '2.0'\n+102E3 Extract OS            00 (0) 'MS-DOS'\n+102E4 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+102E6 Compression Method    0000 (0) 'Stored'\n+102E8 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+102EC CRC                   1758261F (391652895)\n+102F0 Compressed Size       0000495E (18782)\n+102F4 Uncompressed Size     0000495E (18782)\n+102F8 Filename Length       003C (60)\n+102FA Extra Length          0009 (9)\n+102FC Comment Length        0000 (0)\n+102FE Disk Start            0000 (0)\n+10300 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10302 Ext File Attributes   00000000 (0)\n+10306 Local Header Offset   0000A0A3 (41123)\n+1030A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1030A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+10346 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10348   Length              0005 (5)\n+1034A   Flags               01 (1) 'Modification'\n+1034B   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+1034F CENTRAL HEADER #25    02014B50 (33639248)\n+10353 Created Zip Spec      14 (20) '2.0'\n+10354 Created OS            00 (0) 'MS-DOS'\n+10355 Extract Zip Spec      14 (20) '2.0'\n+10356 Extract OS            00 (0) 'MS-DOS'\n+10357 General Purpose Flag  0008 (8)\n+      [Bit  3]              1 'Streamed'\n+10359 Compression Method    0000 (0) 'Stored'\n+1035B Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+1035F CRC                   09B44E50 (162811472)\n+10363 Compressed Size       000004EF (1263)\n+10367 Uncompressed Size     000004EF (1263)\n+1036B Filename Length       0043 (67)\n+1036D Extra Length          0009 (9)\n+1036F Comment Length        0000 (0)\n+10371 Disk Start            0000 (0)\n+10373 Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+10375 Ext File Attributes   00000000 (0)\n+10379 Local Header Offset   0000EA74 (60020)\n+1037D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x1037D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+103C0 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+103C2   Length              0005 (5)\n+103C4   Flags               01 (1) 'Modification'\n+103C5   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+103C9 CENTRAL HEADER #26    02014B50 (33639248)\n+103CD Created Zip Spec      14 (20) '2.0'\n+103CE Created OS            00 (0) 'MS-DOS'\n+103CF Extract Zip Spec      14 (20) '2.0'\n+103D0 Extract OS            00 (0) 'MS-DOS'\n+103D1 General Purpose Flag  0808 (2056)\n       [Bit  3]              1 'Streamed'\n       [Bit 11]              1 'Language Encoding'\n-0FFBF Compression Method    0000 (0) 'Stored'\n-0FFC1 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-0FFC5 CRC                   35541C2F (894704687)\n-0FFC9 Compressed Size       000004D1 (1233)\n-0FFCD Uncompressed Size     000004D1 (1233)\n-0FFD1 Filename Length       0048 (72)\n-0FFD3 Extra Length          0009 (9)\n-0FFD5 Comment Length        0000 (0)\n-0FFD7 Disk Start            0000 (0)\n-0FFD9 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-0FFDB Ext File Attributes   00000000 (0)\n-0FFDF Local Header Offset   0000EC05 (60421)\n-0FFE3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0xFFE3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-1002B Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-1002D   Length              0005 (5)\n-1002F   Flags               01 (1) 'Modification'\n-10030   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-10034 CENTRAL HEADER #27    02014B50 (33639248)\n-10038 Created Zip Spec      14 (20) '2.0'\n-10039 Created OS            00 (0) 'MS-DOS'\n-1003A Extract Zip Spec      14 (20) '2.0'\n-1003B Extract OS            00 (0) 'MS-DOS'\n-1003C General Purpose Flag  0808 (2056)\n+103D3 Compression Method    0000 (0) 'Stored'\n+103D5 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+103D9 CRC                   09B44E50 (162811472)\n+103DD Compressed Size       000004EF (1263)\n+103E1 Uncompressed Size     000004EF (1263)\n+103E5 Filename Length       0048 (72)\n+103E7 Extra Length          0009 (9)\n+103E9 Comment Length        0000 (0)\n+103EB Disk Start            0000 (0)\n+103ED Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+103EF Ext File Attributes   00000000 (0)\n+103F3 Local Header Offset   0000EFDD (61405)\n+103F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x103F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+1043F Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+10441   Length              0005 (5)\n+10443   Flags               01 (1) 'Modification'\n+10444   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+10448 CENTRAL HEADER #27    02014B50 (33639248)\n+1044C Created Zip Spec      14 (20) '2.0'\n+1044D Created OS            00 (0) 'MS-DOS'\n+1044E Extract Zip Spec      14 (20) '2.0'\n+1044F Extract OS            00 (0) 'MS-DOS'\n+10450 General Purpose Flag  0808 (2056)\n       [Bit  3]              1 'Streamed'\n       [Bit 11]              1 'Language Encoding'\n-1003E Compression Method    0000 (0) 'Stored'\n-10040 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n-10044 CRC                   35541C2F (894704687)\n-10048 Compressed Size       000004D1 (1233)\n-1004C Uncompressed Size     000004D1 (1233)\n-10050 Filename Length       0050 (80)\n-10052 Extra Length          0009 (9)\n-10054 Comment Length        0000 (0)\n-10056 Disk Start            0000 (0)\n-10058 Int File Attributes   0000 (0)\n-      [Bit 0]               0 'Binary Data'\n-1005A Ext File Attributes   00000000 (0)\n-1005E Local Header Offset   0000F155 (61781)\n-10062 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x10062: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-100B2 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n-100B4   Length              0005 (5)\n-100B6   Flags               01 (1) 'Modification'\n-100B7   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n-\n-100BB END CENTRAL HEADER    06054B50 (101010256)\n-100BF Number of this disk   0000 (0)\n-100C1 Central Dir Disk no   0000 (0)\n-100C3 Entries in this disk  001B (27)\n-100C5 Total Entries         001B (27)\n-100C7 Size of Central Dir   00000A0E (2574)\n-100CB Offset to Central Dir 0000F6AD (63149)\n-100CF Comment Length        0000 (0)\n+10452 Compression Method    0000 (0) 'Stored'\n+10454 Modification Time     EC210000 (3961585664) 'Wed Jan  1 00:00:00 2098'\n+10458 CRC                   09B44E50 (162811472)\n+1045C Compressed Size       000004EF (1263)\n+10460 Uncompressed Size     000004EF (1263)\n+10464 Filename Length       0050 (80)\n+10466 Extra Length          0009 (9)\n+10468 Comment Length        0000 (0)\n+1046A Disk Start            0000 (0)\n+1046C Int File Attributes   0000 (0)\n+      [Bit 0]               0 'Binary Data'\n+1046E Ext File Attributes   00000000 (0)\n+10472 Local Header Offset   0000F54B (62795)\n+10476 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x10476: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+104C6 Extra ID #1           5455 (21589) 'Extended Timestamp [UT]'\n+104C8   Length              0005 (5)\n+104CA   Flags               01 (1) 'Modification'\n+104CB   Modification Time   00000000 (0) 'Thu Jan  1 00:00:00 1970'\n+\n+104CF END CENTRAL HEADER    06054B50 (101010256)\n+104D3 Number of this disk   0000 (0)\n+104D5 Central Dir Disk no   0000 (0)\n+104D7 Entries in this disk  001B (27)\n+104D9 Total Entries         001B (27)\n+104DB Size of Central Dir   00000A0E (2574)\n+104DF Offset to Central Dir 0000FAC1 (64193)\n+104E3 Comment Length        0000 (0)\n #\n # Warning Count: 54\n #\n # Done\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml", "comments": ["Format-specific differences are supported for XML files but no file-specific differences were detected; falling back to a binary diff. file(1) reports: XML 1.0 document, ASCII text, with CRLF line terminators"], "has_internal_linenos": true, "unified_diff": "@@ -1,154 +1,150 @@\n 00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231  <?xml version=\"1\n 00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554  .0\" encoding=\"UT\n-00000020: 462d 3822 3f3e 0d0a 3c21 2d2d 0d0a 2020  F-8\"?>..<!--..  \n-00000030: 7e20 4c69 6365 6e73 6564 2074 6f20 7468  ~ Licensed to th\n-00000040: 6520 4170 6163 6865 2053 6f66 7477 6172  e Apache Softwar\n-00000050: 6520 466f 756e 6461 7469 6f6e 2028 4153  e Foundation (AS\n-00000060: 4629 2075 6e64 6572 206f 6e65 206f 7220  F) under one or \n-00000070: 6d6f 7265 0d0a 2020 7e20 636f 6e74 7269  more..  ~ contri\n-00000080: 6275 746f 7220 6c69 6365 6e73 6520 6167  butor license ag\n-00000090: 7265 656d 656e 7473 2e20 2053 6565 2074  reements.  See t\n-000000a0: 6865 204e 4f54 4943 4520 6669 6c65 2064  he NOTICE file d\n-000000b0: 6973 7472 6962 7574 6564 2077 6974 680d  istributed with.\n-000000c0: 0a20 207e 2074 6869 7320 776f 726b 2066  .  ~ this work f\n-000000d0: 6f72 2061 6464 6974 696f 6e61 6c20 696e  or additional in\n-000000e0: 666f 726d 6174 696f 6e20 7265 6761 7264  formation regard\n-000000f0: 696e 6720 636f 7079 7269 6768 7420 6f77  ing copyright ow\n-00000100: 6e65 7273 6869 702e 0d0a 2020 7e20 5468  nership...  ~ Th\n-00000110: 6520 4153 4620 6c69 6365 6e73 6573 2074  e ASF licenses t\n-00000120: 6869 7320 6669 6c65 2074 6f20 596f 7520  his file to You \n-00000130: 756e 6465 7220 7468 6520 4170 6163 6865  under the Apache\n-00000140: 204c 6963 656e 7365 2c20 5665 7273 696f   License, Versio\n-00000150: 6e20 322e 300d 0a20 207e 2028 7468 6520  n 2.0..  ~ (the \n-00000160: 224c 6963 656e 7365 2229 3b20 796f 7520  \"License\"); you \n-00000170: 6d61 7920 6e6f 7420 7573 6520 7468 6973  may not use this\n-00000180: 2066 696c 6520 6578 6365 7074 2069 6e20   file except in \n-00000190: 636f 6d70 6c69 616e 6365 2077 6974 680d  compliance with.\n-000001a0: 0a20 207e 2074 6865 204c 6963 656e 7365  .  ~ the License\n-000001b0: 2e20 2059 6f75 206d 6179 206f 6274 6169  .  You may obtai\n-000001c0: 6e20 6120 636f 7079 206f 6620 7468 6520  n a copy of the \n-000001d0: 4c69 6365 6e73 6520 6174 0d0a 2020 7e0d  License at..  ~.\n-000001e0: 0a20 207e 2020 2020 2068 7474 703a 2f2f  .  ~     http://\n-000001f0: 7777 772e 6170 6163 6865 2e6f 7267 2f6c  www.apache.org/l\n-00000200: 6963 656e 7365 732f 4c49 4345 4e53 452d  icenses/LICENSE-\n-00000210: 322e 300d 0a20 207e 0d0a 2020 7e20 556e  2.0..  ~..  ~ Un\n-00000220: 6c65 7373 2072 6571 7569 7265 6420 6279  less required by\n-00000230: 2061 7070 6c69 6361 626c 6520 6c61 7720   applicable law \n-00000240: 6f72 2061 6772 6565 6420 746f 2069 6e20  or agreed to in \n-00000250: 7772 6974 696e 672c 2073 6f66 7477 6172  writing, softwar\n-00000260: 650d 0a20 207e 2064 6973 7472 6962 7574  e..  ~ distribut\n-00000270: 6564 2075 6e64 6572 2074 6865 204c 6963  ed under the Lic\n-00000280: 656e 7365 2069 7320 6469 7374 7269 6275  ense is distribu\n-00000290: 7465 6420 6f6e 2061 6e20 2241 5320 4953  ted on an \"AS IS\n-000002a0: 2220 4241 5349 532c 0d0a 2020 7e20 5749  \" BASIS,..  ~ WI\n-000002b0: 5448 4f55 5420 5741 5252 414e 5449 4553  THOUT WARRANTIES\n-000002c0: 204f 5220 434f 4e44 4954 494f 4e53 204f   OR CONDITIONS O\n-000002d0: 4620 414e 5920 4b49 4e44 2c20 6569 7468  F ANY KIND, eith\n-000002e0: 6572 2065 7870 7265 7373 206f 7220 696d  er express or im\n-000002f0: 706c 6965 642e 0d0a 2020 7e20 5365 6520  plied...  ~ See \n-00000300: 7468 6520 4c69 6365 6e73 6520 666f 7220  the License for \n-00000310: 7468 6520 7370 6563 6966 6963 206c 616e  the specific lan\n-00000320: 6775 6167 6520 676f 7665 726e 696e 6720  guage governing \n-00000330: 7065 726d 6973 7369 6f6e 7320 616e 640d  permissions and.\n-00000340: 0a20 207e 206c 696d 6974 6174 696f 6e73  .  ~ limitations\n-00000350: 2075 6e64 6572 2074 6865 204c 6963 656e   under the Licen\n-00000360: 7365 2e0d 0a20 202d 2d3e 0d0a 3c70 726f  se...  -->..<pro\n-00000370: 6a65 6374 2078 7369 3a73 6368 656d 614c  ject xsi:schemaL\n-00000380: 6f63 6174 696f 6e3d 2268 7474 703a 2f2f  ocation=\"http://\n-00000390: 6d61 7665 6e2e 6170 6163 6865 2e6f 7267  maven.apache.org\n-000003a0: 2f50 4f4d 2f34 2e30 2e30 2068 7474 7073  /POM/4.0.0 https\n-000003b0: 3a2f 2f6d 6176 656e 2e61 7061 6368 652e  ://maven.apache.\n-000003c0: 6f72 672f 7873 642f 6d61 7665 6e2d 342e  org/xsd/maven-4.\n-000003d0: 302e 302e 7873 6422 2078 6d6c 6e73 3d22  0.0.xsd\" xmlns=\"\n-000003e0: 6874 7470 3a2f 2f6d 6176 656e 2e61 7061  http://maven.apa\n-000003f0: 6368 652e 6f72 672f 504f 4d2f 342e 302e  che.org/POM/4.0.\n-00000400: 3022 0d0a 2020 2020 786d 6c6e 733a 7873  0\"..    xmlns:xs\n-00000410: 693d 2268 7474 703a 2f2f 7777 772e 7733  i=\"http://www.w3\n-00000420: 2e6f 7267 2f32 3030 312f 584d 4c53 6368  .org/2001/XMLSch\n-00000430: 656d 612d 696e 7374 616e 6365 223e 0d0a  ema-instance\">..\n-00000440: 2020 3c6d 6f64 656c 5665 7273 696f 6e3e    <modelVersion>\n-00000450: 342e 302e 303c 2f6d 6f64 656c 5665 7273  4.0.0</modelVers\n-00000460: 696f 6e3e 0d0a 2020 3c70 6172 656e 743e  ion>..  <parent>\n-00000470: 0d0a 2020 2020 3c67 726f 7570 4964 3e6f  ..    <groupId>o\n-00000480: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-00000490: 2f67 726f 7570 4964 3e0d 0a20 2020 203c  /groupId>..    <\n-000004a0: 6172 7469 6661 6374 4964 3e64 7562 626f  artifactId>dubbo\n-000004b0: 2d72 6567 6973 7472 793c 2f61 7274 6966  -registry</artif\n-000004c0: 6163 7449 643e 0d0a 2020 2020 3c76 6572  actId>..    <ver\n-000004d0: 7369 6f6e 3e32 2e37 2e31 303c 2f76 6572  sion>2.7.10</ver\n-000004e0: 7369 6f6e 3e0d 0a20 203c 2f70 6172 656e  sion>..  </paren\n-000004f0: 743e 0d0a 2020 3c67 726f 7570 4964 3e6f  t>..  <groupId>o\n-00000500: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n-00000510: 2f67 726f 7570 4964 3e0d 0a20 203c 6172  /groupId>..  <ar\n-00000520: 7469 6661 6374 4964 3e64 7562 626f 2d72  tifactId>dubbo-r\n-00000530: 6567 6973 7472 792d 636f 6e73 756c 3c2f  egistry-consul</\n-00000540: 6172 7469 6661 6374 4964 3e0d 0a20 203c  artifactId>..  <\n-00000550: 7665 7273 696f 6e3e 322e 372e 3130 3c2f  version>2.7.10</\n-00000560: 7665 7273 696f 6e3e 0d0a 2020 3c6c 6963  version>..  <lic\n-00000570: 656e 7365 733e 0d0a 2020 2020 3c6c 6963  enses>..    <lic\n-00000580: 656e 7365 3e0d 0a20 2020 2020 203c 6e61  ense>..      <na\n-00000590: 6d65 3e41 7061 6368 6520 4c69 6365 6e73  me>Apache Licens\n-000005a0: 652c 2056 6572 7369 6f6e 2032 2e30 3c2f  e, Version 2.0</\n-000005b0: 6e61 6d65 3e0d 0a20 2020 2020 203c 7572  name>..      <ur\n-000005c0: 6c3e 6874 7470 3a2f 2f77 7777 2e61 7061  l>http://www.apa\n-000005d0: 6368 652e 6f72 672f 6c69 6365 6e73 6573  che.org/licenses\n-000005e0: 2f4c 4943 454e 5345 2d32 2e30 3c2f 7572  /LICENSE-2.0</ur\n-000005f0: 6c3e 0d0a 2020 2020 2020 3c64 6973 7472  l>..      <distr\n-00000600: 6962 7574 696f 6e3e 7265 706f 3c2f 6469  ibution>repo</di\n-00000610: 7374 7269 6275 7469 6f6e 3e0d 0a20 2020  stribution>..   \n-00000620: 203c 2f6c 6963 656e 7365 3e0d 0a20 203c   </license>..  <\n-00000630: 2f6c 6963 656e 7365 733e 0d0a 2020 3c70  /licenses>..  <p\n-00000640: 726f 7065 7274 6965 733e 0d0a 2020 2020  roperties>..    \n-00000650: 3c73 6b69 7049 6e74 6567 7261 7469 6f6e  <skipIntegration\n-00000660: 5465 7374 733e 7472 7565 3c2f 736b 6970  Tests>true</skip\n-00000670: 496e 7465 6772 6174 696f 6e54 6573 7473  IntegrationTests\n-00000680: 3e0d 0a20 203c 2f70 726f 7065 7274 6965  >..  </propertie\n-00000690: 733e 0d0a 2020 3c64 6570 656e 6465 6e63  s>..  <dependenc\n-000006a0: 6965 733e 0d0a 2020 2020 3c64 6570 656e  ies>..    <depen\n-000006b0: 6465 6e63 793e 0d0a 2020 2020 2020 3c67  dency>..      <g\n-000006c0: 726f 7570 4964 3e6f 7267 2e61 7061 6368  roupId>org.apach\n-000006d0: 652e 6475 6262 6f3c 2f67 726f 7570 4964  e.dubbo</groupId\n-000006e0: 3e0d 0a20 2020 2020 203c 6172 7469 6661  >..      <artifa\n-000006f0: 6374 4964 3e64 7562 626f 2d72 6567 6973  ctId>dubbo-regis\n-00000700: 7472 792d 6170 693c 2f61 7274 6966 6163  try-api</artifac\n-00000710: 7449 643e 0d0a 2020 2020 2020 3c76 6572  tId>..      <ver\n-00000720: 7369 6f6e 3e24 7b70 726f 6a65 6374 2e70  sion>${project.p\n-00000730: 6172 656e 742e 7665 7273 696f 6e7d 3c2f  arent.version}</\n-00000740: 7665 7273 696f 6e3e 0d0a 2020 2020 3c2f  version>..    </\n-00000750: 6465 7065 6e64 656e 6379 3e0d 0a20 2020  dependency>..   \n-00000760: 203c 6465 7065 6e64 656e 6379 3e0d 0a20   <dependency>.. \n-00000770: 2020 2020 203c 6772 6f75 7049 643e 636f       <groupId>co\n-00000780: 6d2e 6563 7769 642e 636f 6e73 756c 3c2f  m.ecwid.consul</\n-00000790: 6772 6f75 7049 643e 0d0a 2020 2020 2020  groupId>..      \n-000007a0: 3c61 7274 6966 6163 7449 643e 636f 6e73  <artifactId>cons\n-000007b0: 756c 2d61 7069 3c2f 6172 7469 6661 6374  ul-api</artifact\n-000007c0: 4964 3e0d 0a20 2020 203c 2f64 6570 656e  Id>..    </depen\n-000007d0: 6465 6e63 793e 0d0a 2020 2020 3c64 6570  dency>..    <dep\n-000007e0: 656e 6465 6e63 793e 0d0a 2020 2020 2020  endency>..      \n-000007f0: 3c67 726f 7570 4964 3e63 6f6d 2e70 737a  <groupId>com.psz\n-00000800: 796d 637a 796b 2e63 6f6e 7375 6c3c 2f67  ymczyk.consul</g\n-00000810: 726f 7570 4964 3e0d 0a20 2020 2020 203c  roupId>..      <\n-00000820: 6172 7469 6661 6374 4964 3e65 6d62 6564  artifactId>embed\n-00000830: 6465 642d 636f 6e73 756c 3c2f 6172 7469  ded-consul</arti\n-00000840: 6661 6374 4964 3e0d 0a20 2020 2020 203c  factId>..      <\n-00000850: 7363 6f70 653e 7465 7374 3c2f 7363 6f70  scope>test</scop\n-00000860: 653e 0d0a 2020 2020 3c2f 6465 7065 6e64  e>..    </depend\n-00000870: 656e 6379 3e0d 0a20 203c 2f64 6570 656e  ency>..  </depen\n-00000880: 6465 6e63 6965 733e 0d0a 2020 3c62 7569  dencies>..  <bui\n-00000890: 6c64 3e0d 0a20 2020 203c 706c 7567 696e  ld>..    <plugin\n-000008a0: 733e 0d0a 2020 2020 2020 3c70 6c75 6769  s>..      <plugi\n-000008b0: 6e3e 0d0a 2020 2020 2020 2020 3c61 7274  n>..        <art\n-000008c0: 6966 6163 7449 643e 6d61 7665 6e2d 7375  ifactId>maven-su\n-000008d0: 7265 6669 7265 2d70 6c75 6769 6e3c 2f61  refire-plugin</a\n-000008e0: 7274 6966 6163 7449 643e 0d0a 2020 2020  rtifactId>..    \n-000008f0: 2020 2020 3c63 6f6e 6669 6775 7261 7469      <configurati\n-00000900: 6f6e 3e0d 0a20 2020 2020 2020 2020 203c  on>..          <\n-00000910: 736b 6970 5465 7374 733e 247b 736b 6970  skipTests>${skip\n-00000920: 496e 7465 6772 6174 696f 6e54 6573 7473  IntegrationTests\n-00000930: 7d3c 2f73 6b69 7054 6573 7473 3e0d 0a20  }</skipTests>.. \n-00000940: 2020 2020 2020 203c 2f63 6f6e 6669 6775         </configu\n-00000950: 7261 7469 6f6e 3e0d 0a20 2020 2020 203c  ration>..      <\n-00000960: 2f70 6c75 6769 6e3e 0d0a 2020 2020 3c2f  /plugin>..    </\n-00000970: 706c 7567 696e 733e 0d0a 2020 3c2f 6275  plugins>..  </bu\n-00000980: 696c 643e 0d0a 3c2f 7072 6f6a 6563 743e  ild>..</project>\n-00000990: 0d0a                                     ..\n+00000020: 462d 3822 3f3e 0a3c 212d 2d0a 2020 7e20  F-8\"?>.<!--.  ~ \n+00000030: 4c69 6365 6e73 6564 2074 6f20 7468 6520  Licensed to the \n+00000040: 4170 6163 6865 2053 6f66 7477 6172 6520  Apache Software \n+00000050: 466f 756e 6461 7469 6f6e 2028 4153 4629  Foundation (ASF)\n+00000060: 2075 6e64 6572 206f 6e65 206f 7220 6d6f   under one or mo\n+00000070: 7265 0a20 207e 2063 6f6e 7472 6962 7574  re.  ~ contribut\n+00000080: 6f72 206c 6963 656e 7365 2061 6772 6565  or license agree\n+00000090: 6d65 6e74 732e 2020 5365 6520 7468 6520  ments.  See the \n+000000a0: 4e4f 5449 4345 2066 696c 6520 6469 7374  NOTICE file dist\n+000000b0: 7269 6275 7465 6420 7769 7468 0a20 207e  ributed with.  ~\n+000000c0: 2074 6869 7320 776f 726b 2066 6f72 2061   this work for a\n+000000d0: 6464 6974 696f 6e61 6c20 696e 666f 726d  dditional inform\n+000000e0: 6174 696f 6e20 7265 6761 7264 696e 6720  ation regarding \n+000000f0: 636f 7079 7269 6768 7420 6f77 6e65 7273  copyright owners\n+00000100: 6869 702e 0a20 207e 2054 6865 2041 5346  hip..  ~ The ASF\n+00000110: 206c 6963 656e 7365 7320 7468 6973 2066   licenses this f\n+00000120: 696c 6520 746f 2059 6f75 2075 6e64 6572  ile to You under\n+00000130: 2074 6865 2041 7061 6368 6520 4c69 6365   the Apache Lice\n+00000140: 6e73 652c 2056 6572 7369 6f6e 2032 2e30  nse, Version 2.0\n+00000150: 0a20 207e 2028 7468 6520 224c 6963 656e  .  ~ (the \"Licen\n+00000160: 7365 2229 3b20 796f 7520 6d61 7920 6e6f  se\"); you may no\n+00000170: 7420 7573 6520 7468 6973 2066 696c 6520  t use this file \n+00000180: 6578 6365 7074 2069 6e20 636f 6d70 6c69  except in compli\n+00000190: 616e 6365 2077 6974 680a 2020 7e20 7468  ance with.  ~ th\n+000001a0: 6520 4c69 6365 6e73 652e 2020 596f 7520  e License.  You \n+000001b0: 6d61 7920 6f62 7461 696e 2061 2063 6f70  may obtain a cop\n+000001c0: 7920 6f66 2074 6865 204c 6963 656e 7365  y of the License\n+000001d0: 2061 740a 2020 7e0a 2020 7e20 2020 2020   at.  ~.  ~     \n+000001e0: 6874 7470 3a2f 2f77 7777 2e61 7061 6368  http://www.apach\n+000001f0: 652e 6f72 672f 6c69 6365 6e73 6573 2f4c  e.org/licenses/L\n+00000200: 4943 454e 5345 2d32 2e30 0a20 207e 0a20  ICENSE-2.0.  ~. \n+00000210: 207e 2055 6e6c 6573 7320 7265 7175 6972   ~ Unless requir\n+00000220: 6564 2062 7920 6170 706c 6963 6162 6c65  ed by applicable\n+00000230: 206c 6177 206f 7220 6167 7265 6564 2074   law or agreed t\n+00000240: 6f20 696e 2077 7269 7469 6e67 2c20 736f  o in writing, so\n+00000250: 6674 7761 7265 0a20 207e 2064 6973 7472  ftware.  ~ distr\n+00000260: 6962 7574 6564 2075 6e64 6572 2074 6865  ibuted under the\n+00000270: 204c 6963 656e 7365 2069 7320 6469 7374   License is dist\n+00000280: 7269 6275 7465 6420 6f6e 2061 6e20 2241  ributed on an \"A\n+00000290: 5320 4953 2220 4241 5349 532c 0a20 207e  S IS\" BASIS,.  ~\n+000002a0: 2057 4954 484f 5554 2057 4152 5241 4e54   WITHOUT WARRANT\n+000002b0: 4945 5320 4f52 2043 4f4e 4449 5449 4f4e  IES OR CONDITION\n+000002c0: 5320 4f46 2041 4e59 204b 494e 442c 2065  S OF ANY KIND, e\n+000002d0: 6974 6865 7220 6578 7072 6573 7320 6f72  ither express or\n+000002e0: 2069 6d70 6c69 6564 2e0a 2020 7e20 5365   implied..  ~ Se\n+000002f0: 6520 7468 6520 4c69 6365 6e73 6520 666f  e the License fo\n+00000300: 7220 7468 6520 7370 6563 6966 6963 206c  r the specific l\n+00000310: 616e 6775 6167 6520 676f 7665 726e 696e  anguage governin\n+00000320: 6720 7065 726d 6973 7369 6f6e 7320 616e  g permissions an\n+00000330: 640a 2020 7e20 6c69 6d69 7461 7469 6f6e  d.  ~ limitation\n+00000340: 7320 756e 6465 7220 7468 6520 4c69 6365  s under the Lice\n+00000350: 6e73 652e 0a20 202d 2d3e 0a3c 7072 6f6a  nse..  -->.<proj\n+00000360: 6563 7420 7873 693a 7363 6865 6d61 4c6f  ect xsi:schemaLo\n+00000370: 6361 7469 6f6e 3d22 6874 7470 3a2f 2f6d  cation=\"http://m\n+00000380: 6176 656e 2e61 7061 6368 652e 6f72 672f  aven.apache.org/\n+00000390: 504f 4d2f 342e 302e 3020 6874 7470 733a  POM/4.0.0 https:\n+000003a0: 2f2f 6d61 7665 6e2e 6170 6163 6865 2e6f  //maven.apache.o\n+000003b0: 7267 2f78 7364 2f6d 6176 656e 2d34 2e30  rg/xsd/maven-4.0\n+000003c0: 2e30 2e78 7364 2220 786d 6c6e 733d 2268  .0.xsd\" xmlns=\"h\n+000003d0: 7474 703a 2f2f 6d61 7665 6e2e 6170 6163  ttp://maven.apac\n+000003e0: 6865 2e6f 7267 2f50 4f4d 2f34 2e30 2e30  he.org/POM/4.0.0\n+000003f0: 220a 2020 2020 786d 6c6e 733a 7873 693d  \".    xmlns:xsi=\n+00000400: 2268 7474 703a 2f2f 7777 772e 7733 2e6f  \"http://www.w3.o\n+00000410: 7267 2f32 3030 312f 584d 4c53 6368 656d  rg/2001/XMLSchem\n+00000420: 612d 696e 7374 616e 6365 223e 0a20 203c  a-instance\">.  <\n+00000430: 6d6f 6465 6c56 6572 7369 6f6e 3e34 2e30  modelVersion>4.0\n+00000440: 2e30 3c2f 6d6f 6465 6c56 6572 7369 6f6e  .0</modelVersion\n+00000450: 3e0a 2020 3c70 6172 656e 743e 0a20 2020  >.  <parent>.   \n+00000460: 203c 6772 6f75 7049 643e 6f72 672e 6170   <groupId>org.ap\n+00000470: 6163 6865 2e64 7562 626f 3c2f 6772 6f75  ache.dubbo</grou\n+00000480: 7049 643e 0a20 2020 203c 6172 7469 6661  pId>.    <artifa\n+00000490: 6374 4964 3e64 7562 626f 2d72 6567 6973  ctId>dubbo-regis\n+000004a0: 7472 793c 2f61 7274 6966 6163 7449 643e  try</artifactId>\n+000004b0: 0a20 2020 203c 7665 7273 696f 6e3e 322e  .    <version>2.\n+000004c0: 372e 3130 3c2f 7665 7273 696f 6e3e 0a20  7.10</version>. \n+000004d0: 203c 2f70 6172 656e 743e 0a20 203c 6772   </parent>.  <gr\n+000004e0: 6f75 7049 643e 6f72 672e 6170 6163 6865  oupId>org.apache\n+000004f0: 2e64 7562 626f 3c2f 6772 6f75 7049 643e  .dubbo</groupId>\n+00000500: 0a20 203c 6172 7469 6661 6374 4964 3e64  .  <artifactId>d\n+00000510: 7562 626f 2d72 6567 6973 7472 792d 636f  ubbo-registry-co\n+00000520: 6e73 756c 3c2f 6172 7469 6661 6374 4964  nsul</artifactId\n+00000530: 3e0a 2020 3c76 6572 7369 6f6e 3e32 2e37  >.  <version>2.7\n+00000540: 2e31 303c 2f76 6572 7369 6f6e 3e0a 2020  .10</version>.  \n+00000550: 3c6c 6963 656e 7365 733e 0a20 2020 203c  <licenses>.    <\n+00000560: 6c69 6365 6e73 653e 0a20 2020 2020 203c  license>.      <\n+00000570: 6e61 6d65 3e41 7061 6368 6520 4c69 6365  name>Apache Lice\n+00000580: 6e73 652c 2056 6572 7369 6f6e 2032 2e30  nse, Version 2.0\n+00000590: 3c2f 6e61 6d65 3e0a 2020 2020 2020 3c75  </name>.      <u\n+000005a0: 726c 3e68 7474 703a 2f2f 7777 772e 6170  rl>http://www.ap\n+000005b0: 6163 6865 2e6f 7267 2f6c 6963 656e 7365  ache.org/license\n+000005c0: 732f 4c49 4345 4e53 452d 322e 303c 2f75  s/LICENSE-2.0</u\n+000005d0: 726c 3e0a 2020 2020 2020 3c64 6973 7472  rl>.      <distr\n+000005e0: 6962 7574 696f 6e3e 7265 706f 3c2f 6469  ibution>repo</di\n+000005f0: 7374 7269 6275 7469 6f6e 3e0a 2020 2020  stribution>.    \n+00000600: 3c2f 6c69 6365 6e73 653e 0a20 203c 2f6c  </license>.  </l\n+00000610: 6963 656e 7365 733e 0a20 203c 7072 6f70  icenses>.  <prop\n+00000620: 6572 7469 6573 3e0a 2020 2020 3c73 6b69  erties>.    <ski\n+00000630: 7049 6e74 6567 7261 7469 6f6e 5465 7374  pIntegrationTest\n+00000640: 733e 7472 7565 3c2f 736b 6970 496e 7465  s>true</skipInte\n+00000650: 6772 6174 696f 6e54 6573 7473 3e0a 2020  grationTests>.  \n+00000660: 3c2f 7072 6f70 6572 7469 6573 3e0a 2020  </properties>.  \n+00000670: 3c64 6570 656e 6465 6e63 6965 733e 0a20  <dependencies>. \n+00000680: 2020 203c 6465 7065 6e64 656e 6379 3e0a     <dependency>.\n+00000690: 2020 2020 2020 3c67 726f 7570 4964 3e6f        <groupId>o\n+000006a0: 7267 2e61 7061 6368 652e 6475 6262 6f3c  rg.apache.dubbo<\n+000006b0: 2f67 726f 7570 4964 3e0a 2020 2020 2020  /groupId>.      \n+000006c0: 3c61 7274 6966 6163 7449 643e 6475 6262  <artifactId>dubb\n+000006d0: 6f2d 7265 6769 7374 7279 2d61 7069 3c2f  o-registry-api</\n+000006e0: 6172 7469 6661 6374 4964 3e0a 2020 2020  artifactId>.    \n+000006f0: 2020 3c76 6572 7369 6f6e 3e24 7b70 726f    <version>${pro\n+00000700: 6a65 6374 2e70 6172 656e 742e 7665 7273  ject.parent.vers\n+00000710: 696f 6e7d 3c2f 7665 7273 696f 6e3e 0a20  ion}</version>. \n+00000720: 2020 203c 2f64 6570 656e 6465 6e63 793e     </dependency>\n+00000730: 0a20 2020 203c 6465 7065 6e64 656e 6379  .    <dependency\n+00000740: 3e0a 2020 2020 2020 3c67 726f 7570 4964  >.      <groupId\n+00000750: 3e63 6f6d 2e65 6377 6964 2e63 6f6e 7375  >com.ecwid.consu\n+00000760: 6c3c 2f67 726f 7570 4964 3e0a 2020 2020  l</groupId>.    \n+00000770: 2020 3c61 7274 6966 6163 7449 643e 636f    <artifactId>co\n+00000780: 6e73 756c 2d61 7069 3c2f 6172 7469 6661  nsul-api</artifa\n+00000790: 6374 4964 3e0a 2020 2020 3c2f 6465 7065  ctId>.    </depe\n+000007a0: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+000007b0: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+000007c0: 6772 6f75 7049 643e 636f 6d2e 7073 7a79  groupId>com.pszy\n+000007d0: 6d63 7a79 6b2e 636f 6e73 756c 3c2f 6772  mczyk.consul</gr\n+000007e0: 6f75 7049 643e 0a20 2020 2020 203c 6172  oupId>.      <ar\n+000007f0: 7469 6661 6374 4964 3e65 6d62 6564 6465  tifactId>embedde\n+00000800: 642d 636f 6e73 756c 3c2f 6172 7469 6661  d-consul</artifa\n+00000810: 6374 4964 3e0a 2020 2020 2020 3c73 636f  ctId>.      <sco\n+00000820: 7065 3e74 6573 743c 2f73 636f 7065 3e0a  pe>test</scope>.\n+00000830: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n+00000840: 3e0a 2020 3c2f 6465 7065 6e64 656e 6369  >.  </dependenci\n+00000850: 6573 3e0a 2020 3c62 7569 6c64 3e0a 2020  es>.  <build>.  \n+00000860: 2020 3c70 6c75 6769 6e73 3e0a 2020 2020    <plugins>.    \n+00000870: 2020 3c70 6c75 6769 6e3e 0a20 2020 2020    <plugin>.     \n+00000880: 2020 203c 6172 7469 6661 6374 4964 3e6d     <artifactId>m\n+00000890: 6176 656e 2d73 7572 6566 6972 652d 706c  aven-surefire-pl\n+000008a0: 7567 696e 3c2f 6172 7469 6661 6374 4964  ugin</artifactId\n+000008b0: 3e0a 2020 2020 2020 2020 3c63 6f6e 6669  >.        <confi\n+000008c0: 6775 7261 7469 6f6e 3e0a 2020 2020 2020  guration>.      \n+000008d0: 2020 2020 3c73 6b69 7054 6573 7473 3e24      <skipTests>$\n+000008e0: 7b73 6b69 7049 6e74 6567 7261 7469 6f6e  {skipIntegration\n+000008f0: 5465 7374 737d 3c2f 736b 6970 5465 7374  Tests}</skipTest\n+00000900: 733e 0a20 2020 2020 2020 203c 2f63 6f6e  s>.        </con\n+00000910: 6669 6775 7261 7469 6f6e 3e0a 2020 2020  figuration>.    \n+00000920: 2020 3c2f 706c 7567 696e 3e0a 2020 2020    </plugin>.    \n+00000930: 3c2f 706c 7567 696e 733e 0a20 203c 2f62  </plugins>.  </b\n+00000940: 7569 6c64 3e0a 3c2f 7072 6f6a 6563 743e  uild>.</project>\n+00000950: 0a                                       .\n"}, {"source1": "org/apache/dubbo/registry/consul/AbstractConsulRegistry.java", "source2": "org/apache/dubbo/registry/consul/AbstractConsulRegistry.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,39 +1,39 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-/**\n- * @author cvictory ON 2019-08-02\n- */\n-public class AbstractConsulRegistry {\n-\n-    static final String SERVICE_TAG = \"dubbo\";\n-    static final String URL_META_KEY = \"url\";\n-    static final String WATCH_TIMEOUT = \"consul-watch-timeout\";\n-    static final String CHECK_PASS_INTERVAL = \"consul-check-pass-interval\";\n-    static final String DEREGISTER_AFTER = \"consul-deregister-critical-service-after\";\n-\n-    static final int DEFAULT_PORT = 8500;\n-    // default watch timeout in millisecond\n-    static final int DEFAULT_WATCH_TIMEOUT = 60 * 1000;\n-    // default time-to-live in millisecond\n-    static final long DEFAULT_CHECK_PASS_INTERVAL = 16000L;\n-    // default deregister critical server after\n-    static final String DEFAULT_DEREGISTER_TIME = \"20s\";\n-\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+/**\r\n+ * @author cvictory ON 2019-08-02\r\n+ */\r\n+public class AbstractConsulRegistry {\r\n+\r\n+    static final String SERVICE_TAG = \"dubbo\";\r\n+    static final String URL_META_KEY = \"url\";\r\n+    static final String WATCH_TIMEOUT = \"consul-watch-timeout\";\r\n+    static final String CHECK_PASS_INTERVAL = \"consul-check-pass-interval\";\r\n+    static final String DEREGISTER_AFTER = \"consul-deregister-critical-service-after\";\r\n+\r\n+    static final int DEFAULT_PORT = 8500;\r\n+    // default watch timeout in millisecond\r\n+    static final int DEFAULT_WATCH_TIMEOUT = 60 * 1000;\r\n+    // default time-to-live in millisecond\r\n+    static final long DEFAULT_CHECK_PASS_INTERVAL = 16000L;\r\n+    // default deregister critical server after\r\n+    static final String DEFAULT_DEREGISTER_TIME = \"20s\";\r\n+\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulParameter.java", "source2": "org/apache/dubbo/registry/consul/ConsulParameter.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,87 +1,87 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-\n-/**\n- * The enumeration for the Consul's parameters on the {@link URL}\n- *\n- * @see URL#getParameters()\n- * @since 2.7.8\n- */\n-public enum ConsulParameter {\n-\n-    ACL_TOKEN,\n-\n-    TAGS,\n-\n-    INSTANCE_ZONE,\n-\n-    DEFAULT_ZONE_METADATA_NAME(\"zone\"),\n-\n-    INSTANCE_GROUP,\n-\n-    CONSISTENCY_MODE,\n-\n-    ;\n-\n-    private final String name;\n-\n-    private final String defaultValue;\n-\n-    ConsulParameter() {\n-        this(null);\n-    }\n-\n-    ConsulParameter(String defaultValue) {\n-        this(null, defaultValue);\n-    }\n-\n-    ConsulParameter(String name, String defaultValue) {\n-        this.name = isBlank(name) ? defaultName() : name;\n-        this.defaultValue = defaultValue;\n-    }\n-\n-    private String defaultName() {\n-        return name().toLowerCase().replace('_', '-');\n-    }\n-\n-    /**\n-     * The parameter value from the specified registry {@link URL}\n-     *\n-     * @param registryURL the specified registry {@link URL}\n-     * @return <code>defaultValue</code> if not found\n-     */\n-    public String getValue(URL registryURL) {\n-        return registryURL.getParameter(name, defaultValue);\n-    }\n-\n-    /**\n-     * The parameter value from the specified registry {@link URL}\n-     *\n-     * @param registryURL  the specified registry {@link URL}\n-     * @param valueType    the type of parameter value\n-     * @param defaultValue the default value if parameter is absent\n-     * @return <code>defaultValue</code> if not found\n-     */\n-    public <T> T getValue(URL registryURL, Class<T> valueType, T defaultValue) {\n-        return registryURL.getParameter(name, valueType, defaultValue);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+\r\n+/**\r\n+ * The enumeration for the Consul's parameters on the {@link URL}\r\n+ *\r\n+ * @see URL#getParameters()\r\n+ * @since 2.7.8\r\n+ */\r\n+public enum ConsulParameter {\r\n+\r\n+    ACL_TOKEN,\r\n+\r\n+    TAGS,\r\n+\r\n+    INSTANCE_ZONE,\r\n+\r\n+    DEFAULT_ZONE_METADATA_NAME(\"zone\"),\r\n+\r\n+    INSTANCE_GROUP,\r\n+\r\n+    CONSISTENCY_MODE,\r\n+\r\n+    ;\r\n+\r\n+    private final String name;\r\n+\r\n+    private final String defaultValue;\r\n+\r\n+    ConsulParameter() {\r\n+        this(null);\r\n+    }\r\n+\r\n+    ConsulParameter(String defaultValue) {\r\n+        this(null, defaultValue);\r\n+    }\r\n+\r\n+    ConsulParameter(String name, String defaultValue) {\r\n+        this.name = isBlank(name) ? defaultName() : name;\r\n+        this.defaultValue = defaultValue;\r\n+    }\r\n+\r\n+    private String defaultName() {\r\n+        return name().toLowerCase().replace('_', '-');\r\n+    }\r\n+\r\n+    /**\r\n+     * The parameter value from the specified registry {@link URL}\r\n+     *\r\n+     * @param registryURL the specified registry {@link URL}\r\n+     * @return <code>defaultValue</code> if not found\r\n+     */\r\n+    public String getValue(URL registryURL) {\r\n+        return registryURL.getParameter(name, defaultValue);\r\n+    }\r\n+\r\n+    /**\r\n+     * The parameter value from the specified registry {@link URL}\r\n+     *\r\n+     * @param registryURL  the specified registry {@link URL}\r\n+     * @param valueType    the type of parameter value\r\n+     * @param defaultValue the default value if parameter is absent\r\n+     * @return <code>defaultValue</code> if not found\r\n+     */\r\n+    public <T> T getValue(URL registryURL, Class<T> valueType, T defaultValue) {\r\n+        return registryURL.getParameter(name, valueType, defaultValue);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulRegistry.java", "source2": "org/apache/dubbo/registry/consul/ConsulRegistry.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,380 +1,380 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import com.ecwid.consul.v1.ConsulClient;\n-import com.ecwid.consul.v1.QueryParams;\n-import com.ecwid.consul.v1.Response;\n-import com.ecwid.consul.v1.agent.model.NewService;\n-import com.ecwid.consul.v1.catalog.CatalogServicesRequest;\n-import com.ecwid.consul.v1.health.HealthServicesRequest;\n-import com.ecwid.consul.v1.health.model.HealthService;\n-\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.ScheduledThreadPoolExecutor;\n-import java.util.concurrent.TimeUnit;\n-import java.util.stream.Collectors;\n-\n-import static java.util.concurrent.Executors.newCachedThreadPool;\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.CHECK_PASS_INTERVAL;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_CHECK_PASS_INTERVAL;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_DEREGISTER_TIME;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_PORT;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_WATCH_TIMEOUT;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEREGISTER_AFTER;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.SERVICE_TAG;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.URL_META_KEY;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.WATCH_TIMEOUT;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-\n-/**\n- * registry center implementation for consul\n- */\n-public class ConsulRegistry extends FailbackRegistry {\n-    private static final Logger logger = LoggerFactory.getLogger(ConsulRegistry.class);\n-\n-    private ConsulClient client;\n-    private long checkPassInterval;\n-    private ExecutorService notifierExecutor = newCachedThreadPool(\n-            new NamedThreadFactory(\"dubbo-consul-notifier\", true));\n-    private ConcurrentMap<URL, ConsulNotifier> notifiers = new ConcurrentHashMap<>();\n-    private ScheduledExecutorService ttlConsulCheckExecutor;\n-    /**\n-     * The ACL token\n-     */\n-    private String token;\n-\n-\n-    public ConsulRegistry(URL url) {\n-        super(url);\n-        token = url.getParameter(TOKEN_KEY, (String) null);\n-        String host = url.getHost();\n-        int port = url.getPort() != 0 ? url.getPort() : DEFAULT_PORT;\n-        client = new ConsulClient(host, port);\n-        checkPassInterval = url.getParameter(CHECK_PASS_INTERVAL, DEFAULT_CHECK_PASS_INTERVAL);\n-        ttlConsulCheckExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(\"Ttl-Consul-Check-Executor\", true));\n-        ttlConsulCheckExecutor.scheduleAtFixedRate(this::checkPass, checkPassInterval / 8,\n-                checkPassInterval / 8, TimeUnit.MILLISECONDS);\n-    }\n-\n-    @Override\n-    public void register(URL url) {\n-        if (isConsumerSide(url)) {\n-            return;\n-        }\n-\n-        super.register(url);\n-    }\n-\n-    @Override\n-    public void doRegister(URL url) {\n-        if (token == null) {\n-            client.agentServiceRegister(buildService(url));\n-        } else {\n-            client.agentServiceRegister(buildService(url), token);\n-        }\n-    }\n-\n-    @Override\n-    public void unregister(URL url) {\n-        if (isConsumerSide(url)) {\n-            return;\n-        }\n-\n-        super.unregister(url);\n-    }\n-\n-    @Override\n-    public void doUnregister(URL url) {\n-        if (token == null) {\n-            client.agentServiceDeregister(buildId(url));\n-        } else {\n-            client.agentServiceDeregister(buildId(url), token);\n-        }\n-    }\n-\n-    @Override\n-    public void subscribe(URL url, NotifyListener listener) {\n-        if (isProviderSide(url)) {\n-            return;\n-        }\n-\n-        super.subscribe(url, listener);\n-    }\n-\n-    @Override\n-    public void doSubscribe(URL url, NotifyListener listener) {\n-        Long index;\n-        List<URL> urls;\n-        if (ANY_VALUE.equals(url.getServiceInterface())) {\n-            Response<Map<String, List<String>>> response = getAllServices(-1, buildWatchTimeout(url));\n-            index = response.getConsulIndex();\n-            List<HealthService> services = getHealthServices(response.getValue());\n-            urls = convert(services, url);\n-        } else {\n-            String service = url.getServiceInterface();\n-            Response<List<HealthService>> response = getHealthServices(service, -1, buildWatchTimeout(url));\n-            index = response.getConsulIndex();\n-            urls = convert(response.getValue(), url);\n-        }\n-\n-        notify(url, listener, urls);\n-        ConsulNotifier notifier = notifiers.computeIfAbsent(url, k -> new ConsulNotifier(url, index));\n-        notifierExecutor.submit(notifier);\n-    }\n-\n-    @Override\n-    public void unsubscribe(URL url, NotifyListener listener) {\n-        if (isProviderSide(url)) {\n-            return;\n-        }\n-\n-        super.unsubscribe(url, listener);\n-    }\n-\n-    @Override\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        ConsulNotifier notifier = notifiers.remove(url);\n-        notifier.stop();\n-    }\n-\n-    @Override\n-    public List<URL> lookup(URL url) {\n-        if (url == null) {\n-            throw new IllegalArgumentException(\"lookup url == null\");\n-        }\n-        try {\n-            String service = url.getServiceKey();\n-            Response<List<HealthService>> result = getHealthServices(service, -1, buildWatchTimeout(url));\n-            if (result == null || result.getValue() == null || result.getValue().isEmpty()) {\n-                return new ArrayList<>();\n-            } else {\n-                return convert(result.getValue(), url);\n-            }\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to lookup \" + url + \" from consul \" + getUrl() + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return client.getAgentSelf() != null;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        super.destroy();\n-        notifierExecutor.shutdown();\n-        ttlConsulCheckExecutor.shutdown();\n-    }\n-\n-    private void checkPass() {\n-        for (URL url : getRegistered()) {\n-            String checkId = buildId(url);\n-            try {\n-                if (token == null) {\n-                    client.agentCheckPass(\"service:\" + checkId);\n-                } else {\n-                    client.agentCheckPass(\"service:\" + checkId, null, token);\n-                }\n-                if (logger.isDebugEnabled()) {\n-                    logger.debug(\"check pass for url: \" + url + \" with check id: \" + checkId);\n-                }\n-            } catch (Throwable t) {\n-                logger.warn(\"fail to check pass for url: \" + url + \", check id is: \" + checkId, t);\n-            }\n-        }\n-    }\n-\n-    private Response<List<HealthService>> getHealthServices(String service, long index, int watchTimeout) {\n-        HealthServicesRequest request = HealthServicesRequest.newBuilder()\n-                .setTag(SERVICE_TAG)\n-                .setQueryParams(new QueryParams(watchTimeout, index))\n-                .setPassing(true)\n-                .setToken(token)\n-                .build();\n-        return client.getHealthServices(service, request);\n-    }\n-\n-    private Response<Map<String, List<String>>> getAllServices(long index, int watchTimeout) {\n-        CatalogServicesRequest request = CatalogServicesRequest.newBuilder()\n-                .setQueryParams(new QueryParams(watchTimeout, index))\n-                .setToken(token)\n-                .build();\n-        return client.getCatalogServices(request);\n-    }\n-\n-    private List<HealthService> getHealthServices(Map<String, List<String>> services) {\n-        return services.entrySet().stream()\n-                .filter(s -> s.getValue().contains(SERVICE_TAG))\n-                .map(s -> getHealthServices(s.getKey(), -1, -1).getValue())\n-                .flatMap(Collection::stream)\n-                .collect(Collectors.toList());\n-    }\n-\n-\n-    private boolean isConsumerSide(URL url) {\n-        return url.getProtocol().equals(CONSUMER_PROTOCOL);\n-    }\n-\n-    private boolean isProviderSide(URL url) {\n-        return url.getProtocol().equals(PROVIDER_PROTOCOL);\n-    }\n-\n-    private List<URL> convert(List<HealthService> services, URL consumerURL) {\n-        if (CollectionUtils.isEmpty(services)) {\n-            return emptyURL(consumerURL);\n-        }\n-        return services.stream()\n-                .map(HealthService::getService)\n-                .filter(Objects::nonNull)\n-                .map(HealthService.Service::getMeta)\n-                .filter(m -> m != null && m.containsKey(URL_META_KEY))\n-                .map(m -> m.get(URL_META_KEY))\n-                .map(URL::valueOf)\n-                .filter(url -> UrlUtils.isMatch(consumerURL, url))\n-                .collect(Collectors.toList());\n-    }\n-\n-    private List<URL> emptyURL(URL consumerURL) {\n-        // No Category Parameter\n-        URL empty = URLBuilder.from(consumerURL)\n-                .setProtocol(EMPTY_PROTOCOL)\n-                .removeParameter(CATEGORY_KEY)\n-                .build();\n-        List<URL> result = new ArrayList<URL>();\n-        result.add(empty);\n-        return result;\n-    }\n-\n-    private NewService buildService(URL url) {\n-        NewService service = new NewService();\n-        service.setAddress(url.getHost());\n-        service.setPort(url.getPort());\n-        service.setId(buildId(url));\n-        service.setName(url.getServiceInterface());\n-        service.setCheck(buildCheck(url));\n-        service.setTags(buildTags(url));\n-        service.setMeta(Collections.singletonMap(URL_META_KEY, url.toFullString()));\n-        return service;\n-    }\n-\n-    private List<String> buildTags(URL url) {\n-        Map<String, String> params = url.getParameters();\n-        List<String> tags = params.entrySet().stream()\n-                .map(k -> k.getKey() + \"=\" + k.getValue())\n-                .collect(Collectors.toList());\n-        tags.add(SERVICE_TAG);\n-        return tags;\n-    }\n-\n-    private String buildId(URL url) {\n-        // let's simply use url's hashcode to generate unique service id for now\n-        return Integer.toHexString(url.hashCode());\n-    }\n-\n-    private NewService.Check buildCheck(URL url) {\n-        NewService.Check check = new NewService.Check();\n-        check.setTtl((checkPassInterval / 1000) + \"s\");\n-        check.setDeregisterCriticalServiceAfter(url.getParameter(DEREGISTER_AFTER, DEFAULT_DEREGISTER_TIME));\n-        return check;\n-    }\n-\n-    private int buildWatchTimeout(URL url) {\n-        return url.getParameter(WATCH_TIMEOUT, DEFAULT_WATCH_TIMEOUT) / 1000;\n-    }\n-\n-    private class ConsulNotifier implements Runnable {\n-        private URL url;\n-        private long consulIndex;\n-        private boolean running;\n-\n-        ConsulNotifier(URL url, long consulIndex) {\n-            this.url = url;\n-            this.consulIndex = consulIndex;\n-            this.running = true;\n-        }\n-\n-        @Override\n-        public void run() {\n-            while (this.running) {\n-                if (ANY_VALUE.equals(url.getServiceInterface())) {\n-                    processServices();\n-                } else {\n-                    processService();\n-                }\n-            }\n-        }\n-\n-        private void processService() {\n-            String service = url.getServiceKey();\n-            Response<List<HealthService>> response = getHealthServices(service, consulIndex, buildWatchTimeout(url));\n-            Long currentIndex = response.getConsulIndex();\n-            if (currentIndex != null && currentIndex > consulIndex) {\n-                consulIndex = currentIndex;\n-                List<HealthService> services = response.getValue();\n-                List<URL> urls = convert(services, url);\n-                for (NotifyListener listener : getSubscribed().get(url)) {\n-                    doNotify(url, listener, urls);\n-                }\n-            }\n-        }\n-\n-        private void processServices() {\n-            Response<Map<String, List<String>>> response = getAllServices(consulIndex, buildWatchTimeout(url));\n-            Long currentIndex = response.getConsulIndex();\n-            if (currentIndex != null && currentIndex > consulIndex) {\n-                consulIndex = currentIndex;\n-                List<HealthService> services = getHealthServices(response.getValue());\n-                List<URL> urls = convert(services, url);\n-                for (NotifyListener listener : getSubscribed().get(url)) {\n-                    doNotify(url, listener, urls);\n-                }\n-            }\n-        }\n-\n-        void stop() {\n-            this.running = false;\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import com.ecwid.consul.v1.ConsulClient;\r\n+import com.ecwid.consul.v1.QueryParams;\r\n+import com.ecwid.consul.v1.Response;\r\n+import com.ecwid.consul.v1.agent.model.NewService;\r\n+import com.ecwid.consul.v1.catalog.CatalogServicesRequest;\r\n+import com.ecwid.consul.v1.health.HealthServicesRequest;\r\n+import com.ecwid.consul.v1.health.model.HealthService;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.ScheduledThreadPoolExecutor;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.util.concurrent.Executors.newCachedThreadPool;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.CHECK_PASS_INTERVAL;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_CHECK_PASS_INTERVAL;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_DEREGISTER_TIME;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_PORT;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_WATCH_TIMEOUT;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEREGISTER_AFTER;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.SERVICE_TAG;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.URL_META_KEY;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.WATCH_TIMEOUT;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+\r\n+/**\r\n+ * registry center implementation for consul\r\n+ */\r\n+public class ConsulRegistry extends FailbackRegistry {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConsulRegistry.class);\r\n+\r\n+    private ConsulClient client;\r\n+    private long checkPassInterval;\r\n+    private ExecutorService notifierExecutor = newCachedThreadPool(\r\n+            new NamedThreadFactory(\"dubbo-consul-notifier\", true));\r\n+    private ConcurrentMap<URL, ConsulNotifier> notifiers = new ConcurrentHashMap<>();\r\n+    private ScheduledExecutorService ttlConsulCheckExecutor;\r\n+    /**\r\n+     * The ACL token\r\n+     */\r\n+    private String token;\r\n+\r\n+\r\n+    public ConsulRegistry(URL url) {\r\n+        super(url);\r\n+        token = url.getParameter(TOKEN_KEY, (String) null);\r\n+        String host = url.getHost();\r\n+        int port = url.getPort() != 0 ? url.getPort() : DEFAULT_PORT;\r\n+        client = new ConsulClient(host, port);\r\n+        checkPassInterval = url.getParameter(CHECK_PASS_INTERVAL, DEFAULT_CHECK_PASS_INTERVAL);\r\n+        ttlConsulCheckExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(\"Ttl-Consul-Check-Executor\", true));\r\n+        ttlConsulCheckExecutor.scheduleAtFixedRate(this::checkPass, checkPassInterval / 8,\r\n+                checkPassInterval / 8, TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void register(URL url) {\r\n+        if (isConsumerSide(url)) {\r\n+            return;\r\n+        }\r\n+\r\n+        super.register(url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(URL url) {\r\n+        if (token == null) {\r\n+            client.agentServiceRegister(buildService(url));\r\n+        } else {\r\n+            client.agentServiceRegister(buildService(url), token);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(URL url) {\r\n+        if (isConsumerSide(url)) {\r\n+            return;\r\n+        }\r\n+\r\n+        super.unregister(url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnregister(URL url) {\r\n+        if (token == null) {\r\n+            client.agentServiceDeregister(buildId(url));\r\n+        } else {\r\n+            client.agentServiceDeregister(buildId(url), token);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void subscribe(URL url, NotifyListener listener) {\r\n+        if (isProviderSide(url)) {\r\n+            return;\r\n+        }\r\n+\r\n+        super.subscribe(url, listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doSubscribe(URL url, NotifyListener listener) {\r\n+        Long index;\r\n+        List<URL> urls;\r\n+        if (ANY_VALUE.equals(url.getServiceInterface())) {\r\n+            Response<Map<String, List<String>>> response = getAllServices(-1, buildWatchTimeout(url));\r\n+            index = response.getConsulIndex();\r\n+            List<HealthService> services = getHealthServices(response.getValue());\r\n+            urls = convert(services, url);\r\n+        } else {\r\n+            String service = url.getServiceInterface();\r\n+            Response<List<HealthService>> response = getHealthServices(service, -1, buildWatchTimeout(url));\r\n+            index = response.getConsulIndex();\r\n+            urls = convert(response.getValue(), url);\r\n+        }\r\n+\r\n+        notify(url, listener, urls);\r\n+        ConsulNotifier notifier = notifiers.computeIfAbsent(url, k -> new ConsulNotifier(url, index));\r\n+        notifierExecutor.submit(notifier);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unsubscribe(URL url, NotifyListener listener) {\r\n+        if (isProviderSide(url)) {\r\n+            return;\r\n+        }\r\n+\r\n+        super.unsubscribe(url, listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        ConsulNotifier notifier = notifiers.remove(url);\r\n+        notifier.stop();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(URL url) {\r\n+        if (url == null) {\r\n+            throw new IllegalArgumentException(\"lookup url == null\");\r\n+        }\r\n+        try {\r\n+            String service = url.getServiceKey();\r\n+            Response<List<HealthService>> result = getHealthServices(service, -1, buildWatchTimeout(url));\r\n+            if (result == null || result.getValue() == null || result.getValue().isEmpty()) {\r\n+                return new ArrayList<>();\r\n+            } else {\r\n+                return convert(result.getValue(), url);\r\n+            }\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to lookup \" + url + \" from consul \" + getUrl() + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return client.getAgentSelf() != null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        super.destroy();\r\n+        notifierExecutor.shutdown();\r\n+        ttlConsulCheckExecutor.shutdown();\r\n+    }\r\n+\r\n+    private void checkPass() {\r\n+        for (URL url : getRegistered()) {\r\n+            String checkId = buildId(url);\r\n+            try {\r\n+                if (token == null) {\r\n+                    client.agentCheckPass(\"service:\" + checkId);\r\n+                } else {\r\n+                    client.agentCheckPass(\"service:\" + checkId, null, token);\r\n+                }\r\n+                if (logger.isDebugEnabled()) {\r\n+                    logger.debug(\"check pass for url: \" + url + \" with check id: \" + checkId);\r\n+                }\r\n+            } catch (Throwable t) {\r\n+                logger.warn(\"fail to check pass for url: \" + url + \", check id is: \" + checkId, t);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private Response<List<HealthService>> getHealthServices(String service, long index, int watchTimeout) {\r\n+        HealthServicesRequest request = HealthServicesRequest.newBuilder()\r\n+                .setTag(SERVICE_TAG)\r\n+                .setQueryParams(new QueryParams(watchTimeout, index))\r\n+                .setPassing(true)\r\n+                .setToken(token)\r\n+                .build();\r\n+        return client.getHealthServices(service, request);\r\n+    }\r\n+\r\n+    private Response<Map<String, List<String>>> getAllServices(long index, int watchTimeout) {\r\n+        CatalogServicesRequest request = CatalogServicesRequest.newBuilder()\r\n+                .setQueryParams(new QueryParams(watchTimeout, index))\r\n+                .setToken(token)\r\n+                .build();\r\n+        return client.getCatalogServices(request);\r\n+    }\r\n+\r\n+    private List<HealthService> getHealthServices(Map<String, List<String>> services) {\r\n+        return services.entrySet().stream()\r\n+                .filter(s -> s.getValue().contains(SERVICE_TAG))\r\n+                .map(s -> getHealthServices(s.getKey(), -1, -1).getValue())\r\n+                .flatMap(Collection::stream)\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+\r\n+    private boolean isConsumerSide(URL url) {\r\n+        return url.getProtocol().equals(CONSUMER_PROTOCOL);\r\n+    }\r\n+\r\n+    private boolean isProviderSide(URL url) {\r\n+        return url.getProtocol().equals(PROVIDER_PROTOCOL);\r\n+    }\r\n+\r\n+    private List<URL> convert(List<HealthService> services, URL consumerURL) {\r\n+        if (CollectionUtils.isEmpty(services)) {\r\n+            return emptyURL(consumerURL);\r\n+        }\r\n+        return services.stream()\r\n+                .map(HealthService::getService)\r\n+                .filter(Objects::nonNull)\r\n+                .map(HealthService.Service::getMeta)\r\n+                .filter(m -> m != null && m.containsKey(URL_META_KEY))\r\n+                .map(m -> m.get(URL_META_KEY))\r\n+                .map(URL::valueOf)\r\n+                .filter(url -> UrlUtils.isMatch(consumerURL, url))\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    private List<URL> emptyURL(URL consumerURL) {\r\n+        // No Category Parameter\r\n+        URL empty = URLBuilder.from(consumerURL)\r\n+                .setProtocol(EMPTY_PROTOCOL)\r\n+                .removeParameter(CATEGORY_KEY)\r\n+                .build();\r\n+        List<URL> result = new ArrayList<URL>();\r\n+        result.add(empty);\r\n+        return result;\r\n+    }\r\n+\r\n+    private NewService buildService(URL url) {\r\n+        NewService service = new NewService();\r\n+        service.setAddress(url.getHost());\r\n+        service.setPort(url.getPort());\r\n+        service.setId(buildId(url));\r\n+        service.setName(url.getServiceInterface());\r\n+        service.setCheck(buildCheck(url));\r\n+        service.setTags(buildTags(url));\r\n+        service.setMeta(Collections.singletonMap(URL_META_KEY, url.toFullString()));\r\n+        return service;\r\n+    }\r\n+\r\n+    private List<String> buildTags(URL url) {\r\n+        Map<String, String> params = url.getParameters();\r\n+        List<String> tags = params.entrySet().stream()\r\n+                .map(k -> k.getKey() + \"=\" + k.getValue())\r\n+                .collect(Collectors.toList());\r\n+        tags.add(SERVICE_TAG);\r\n+        return tags;\r\n+    }\r\n+\r\n+    private String buildId(URL url) {\r\n+        // let's simply use url's hashcode to generate unique service id for now\r\n+        return Integer.toHexString(url.hashCode());\r\n+    }\r\n+\r\n+    private NewService.Check buildCheck(URL url) {\r\n+        NewService.Check check = new NewService.Check();\r\n+        check.setTtl((checkPassInterval / 1000) + \"s\");\r\n+        check.setDeregisterCriticalServiceAfter(url.getParameter(DEREGISTER_AFTER, DEFAULT_DEREGISTER_TIME));\r\n+        return check;\r\n+    }\r\n+\r\n+    private int buildWatchTimeout(URL url) {\r\n+        return url.getParameter(WATCH_TIMEOUT, DEFAULT_WATCH_TIMEOUT) / 1000;\r\n+    }\r\n+\r\n+    private class ConsulNotifier implements Runnable {\r\n+        private URL url;\r\n+        private long consulIndex;\r\n+        private boolean running;\r\n+\r\n+        ConsulNotifier(URL url, long consulIndex) {\r\n+            this.url = url;\r\n+            this.consulIndex = consulIndex;\r\n+            this.running = true;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void run() {\r\n+            while (this.running) {\r\n+                if (ANY_VALUE.equals(url.getServiceInterface())) {\r\n+                    processServices();\r\n+                } else {\r\n+                    processService();\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        private void processService() {\r\n+            String service = url.getServiceKey();\r\n+            Response<List<HealthService>> response = getHealthServices(service, consulIndex, buildWatchTimeout(url));\r\n+            Long currentIndex = response.getConsulIndex();\r\n+            if (currentIndex != null && currentIndex > consulIndex) {\r\n+                consulIndex = currentIndex;\r\n+                List<HealthService> services = response.getValue();\r\n+                List<URL> urls = convert(services, url);\r\n+                for (NotifyListener listener : getSubscribed().get(url)) {\r\n+                    doNotify(url, listener, urls);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        private void processServices() {\r\n+            Response<Map<String, List<String>>> response = getAllServices(consulIndex, buildWatchTimeout(url));\r\n+            Long currentIndex = response.getConsulIndex();\r\n+            if (currentIndex != null && currentIndex > consulIndex) {\r\n+                consulIndex = currentIndex;\r\n+                List<HealthService> services = getHealthServices(response.getValue());\r\n+                List<URL> urls = convert(services, url);\r\n+                for (NotifyListener listener : getSubscribed().get(url)) {\r\n+                    doNotify(url, listener, urls);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        void stop() {\r\n+            this.running = false;\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulRegistryFactory.java", "source2": "org/apache/dubbo/registry/consul/ConsulRegistryFactory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,32 +1,32 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-\n-/**\n- * registry center factory implementation for consul\n- */\n-public class ConsulRegistryFactory extends AbstractRegistryFactory {\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        return new ConsulRegistry(url);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+\r\n+/**\r\n+ * registry center factory implementation for consul\r\n+ */\r\n+public class ConsulRegistryFactory extends AbstractRegistryFactory {\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        return new ConsulRegistry(url);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java", "source2": "org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,481 +1,481 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import com.ecwid.consul.v1.ConsistencyMode;\n-import com.ecwid.consul.v1.ConsulClient;\n-import com.ecwid.consul.v1.QueryParams;\n-import com.ecwid.consul.v1.Response;\n-import com.ecwid.consul.v1.agent.model.NewService;\n-import com.ecwid.consul.v1.catalog.CatalogServicesRequest;\n-import com.ecwid.consul.v1.health.HealthServicesRequest;\n-import com.ecwid.consul.v1.health.model.HealthService;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.Base64;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.Executors;\n-import java.util.concurrent.ScheduledExecutorService;\n-import java.util.concurrent.ScheduledFuture;\n-import java.util.concurrent.TimeUnit;\n-import java.util.stream.Collectors;\n-\n-import static java.util.concurrent.Executors.newCachedThreadPool;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\n-import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.CHECK_PASS_INTERVAL;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_CHECK_PASS_INTERVAL;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_DEREGISTER_TIME;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_PORT;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_WATCH_TIMEOUT;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEREGISTER_AFTER;\n-import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.WATCH_TIMEOUT;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.ACL_TOKEN;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.CONSISTENCY_MODE;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.DEFAULT_ZONE_METADATA_NAME;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.INSTANCE_GROUP;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.INSTANCE_ZONE;\n-import static org.apache.dubbo.registry.consul.ConsulParameter.TAGS;\n-\n-/**\n- * 2019-07-31\n- */\n-public class ConsulServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(ConsulServiceDiscovery.class);\n-\n-    private static final String QUERY_TAG = \"consul_query_tag\";\n-    private static final String REGISTER_TAG = \"consul_register_tag\";\n-\n-    private List<String> registeringTags = new ArrayList<>();\n-    private String tag;\n-    private ConsulClient client;\n-    private ExecutorService notifierExecutor = newCachedThreadPool(\n-            new NamedThreadFactory(\"dubbo-service-discovery-consul-notifier\", true));\n-    private Map<String, ConsulNotifier> notifiers = new ConcurrentHashMap<>();\n-    private TtlScheduler ttlScheduler;\n-    private long checkPassInterval;\n-    private URL url;\n-\n-    private String aclToken;\n-\n-    private List<String> tags;\n-\n-    private ConsistencyMode consistencyMode;\n-\n-    private String defaultZoneMetadataName;\n-\n-    /**\n-     * Service instance zone.\n-     */\n-    private String instanceZone;\n-\n-    /**\n-     * Service instance group.\n-     */\n-    private String instanceGroup;\n-\n-\n-    @Override\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        this.url = registryURL;\n-        String host = url.getHost();\n-        int port = url.getPort() != 0 ? url.getPort() : DEFAULT_PORT;\n-        checkPassInterval = url.getParameter(CHECK_PASS_INTERVAL, DEFAULT_CHECK_PASS_INTERVAL);\n-        client = new ConsulClient(host, port);\n-        ttlScheduler = new TtlScheduler(checkPassInterval, client);\n-        this.tag = registryURL.getParameter(QUERY_TAG);\n-        this.registeringTags.addAll(getRegisteringTags(url));\n-        this.aclToken = ACL_TOKEN.getValue(registryURL);\n-        this.tags = getTags(registryURL);\n-        this.consistencyMode = getConsistencyMode(registryURL);\n-        this.defaultZoneMetadataName = DEFAULT_ZONE_METADATA_NAME.getValue(registryURL);\n-        this.instanceZone = INSTANCE_ZONE.getValue(registryURL);\n-        this.instanceGroup = INSTANCE_GROUP.getValue(registryURL);\n-    }\n-\n-    /**\n-     * Get the {@link ConsistencyMode}\n-     *\n-     * @param registryURL the {@link URL} of registry\n-     * @return non-null, {@link ConsistencyMode#DEFAULT} as default\n-     * @sine 2.7.8\n-     */\n-    private ConsistencyMode getConsistencyMode(URL registryURL) {\n-        String value = CONSISTENCY_MODE.getValue(registryURL);\n-        if (StringUtils.isNotEmpty(value)) {\n-            return ConsistencyMode.valueOf(value);\n-        }\n-        return ConsistencyMode.DEFAULT;\n-    }\n-\n-    /**\n-     * Get the \"tags\" from the {@link URL} of registry\n-     *\n-     * @param registryURL the {@link URL} of registry\n-     * @return non-null\n-     * @sine 2.7.8\n-     */\n-    private List<String> getTags(URL registryURL) {\n-        String value = TAGS.getValue(registryURL);\n-        return StringUtils.splitToList(value, COMMA_SEPARATOR_CHAR);\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return url;\n-    }\n-\n-    private List<String> getRegisteringTags(URL url) {\n-        List<String> tags = new ArrayList<>();\n-        String rawTag = url.getParameter(REGISTER_TAG);\n-        if (StringUtils.isNotEmpty(rawTag)) {\n-            tags.addAll(Arrays.asList(SEMICOLON_SPLIT_PATTERN.split(rawTag)));\n-        }\n-        return tags;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        notifiers.forEach((_k, notifier) -> {\n-            if (notifier != null) {\n-                notifier.stop();\n-            }\n-        });\n-        notifiers.clear();\n-        notifierExecutor.shutdownNow();\n-        ttlScheduler.stop();\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        NewService consulService = buildService(serviceInstance);\n-        ttlScheduler.add(consulService.getId());\n-        client.agentServiceRegister(consulService, aclToken);\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\n-        Set<String> serviceNames = listener.getServiceNames();\n-        for (String serviceName : serviceNames) {\n-            ConsulNotifier notifier = notifiers.get(serviceName);\n-            if (notifier == null) {\n-                Response<List<HealthService>> response = getHealthServices(serviceName, -1, buildWatchTimeout());\n-                Long consulIndex = response.getConsulIndex();\n-                notifier = new ConsulNotifier(serviceName, consulIndex);\n-            }\n-            notifierExecutor.execute(notifier);\n-        }\n-    }\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        // TODO\n-        // client.catalogRegister(buildCatalogService(serviceInstance));\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        String id = buildId(serviceInstance);\n-        ttlScheduler.remove(id);\n-        client.agentServiceDeregister(id, aclToken);\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        CatalogServicesRequest request = CatalogServicesRequest.newBuilder()\n-                .setQueryParams(QueryParams.DEFAULT)\n-                .setToken(aclToken)\n-                .build();\n-        return this.client.getCatalogServices(request).getValue().keySet();\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-        Response<List<HealthService>> response = getHealthServices(serviceName, -1, buildWatchTimeout());\n-        Long consulIndex = response.getConsulIndex();\n-        ConsulNotifier notifier = notifiers.get(serviceName);\n-        if (notifier == null) {\n-            notifier = new ConsulNotifier(serviceName, consulIndex);\n-            notifiers.put(serviceName, notifier);\n-        }\n-        return convert(response.getValue());\n-    }\n-\n-    private List<ServiceInstance> convert(List<HealthService> services) {\n-        return services.stream()\n-                .map(HealthService::getService)\n-                .map(service -> {\n-                    ServiceInstance instance = new DefaultServiceInstance(\n-                            service.getId(),\n-                            service.getService(),\n-                            service.getAddress(),\n-                            service.getPort());\n-                    instance.getMetadata().putAll(getMetadata(service));\n-                    return instance;\n-                })\n-                .collect(Collectors.toList());\n-    }\n-\n-    private Response<List<HealthService>> getHealthServices(String service, long index, int watchTimeout) {\n-        HealthServicesRequest request = HealthServicesRequest.newBuilder()\n-                .setTag(tag)\n-                .setQueryParams(new QueryParams(watchTimeout, index))\n-                .setPassing(true)\n-                .build();\n-        return client.getHealthServices(service, request);\n-    }\n-\n-    private Map<String, String> getMetadata(HealthService.Service service) {\n-        Map<String, String> metadata = service.getMeta();\n-        metadata = decodeMetadata(metadata);\n-        if (CollectionUtils.isEmptyMap(metadata)) {\n-            metadata = getScCompatibleMetadata(service.getTags());\n-        }\n-        return metadata;\n-    }\n-\n-    private Map<String, String> getScCompatibleMetadata(List<String> tags) {\n-        LinkedHashMap<String, String> metadata = new LinkedHashMap<>();\n-        if (tags != null) {\n-            for (String tag : tags) {\n-                String[] parts = StringUtils.delimitedListToStringArray(tag, \"=\");\n-                switch (parts.length) {\n-                    case 0:\n-                        break;\n-                    case 1:\n-                        metadata.put(parts[0], parts[0]);\n-                        break;\n-                    case 2:\n-                        metadata.put(parts[0], parts[1]);\n-                        break;\n-                    default:\n-                        String[] end = Arrays.copyOfRange(parts, 1, parts.length);\n-                        metadata.put(parts[0], StringUtils.arrayToDelimitedString(end, \"=\"));\n-                        break;\n-                }\n-\n-            }\n-        }\n-\n-        return metadata;\n-    }\n-\n-    private NewService buildService(ServiceInstance serviceInstance) {\n-        NewService service = new NewService();\n-        service.setAddress(serviceInstance.getHost());\n-        service.setPort(serviceInstance.getPort());\n-        service.setId(buildId(serviceInstance));\n-        service.setName(serviceInstance.getServiceName());\n-        service.setCheck(buildCheck(serviceInstance));\n-        service.setTags(buildTags(serviceInstance));\n-        return service;\n-    }\n-\n-    private String buildId(ServiceInstance serviceInstance) {\n-        return Integer.toHexString(serviceInstance.hashCode());\n-    }\n-\n-    private List<String> buildTags(ServiceInstance serviceInstance) {\n-        List<String> tags = new LinkedList<>(this.tags);\n-\n-        if (StringUtils.isNotEmpty(instanceZone)) {\n-            tags.add(defaultZoneMetadataName + \"=\" + instanceZone);\n-        }\n-\n-        if (StringUtils.isNotEmpty(instanceGroup)) {\n-            tags.add(\"group=\" + instanceGroup);\n-        }\n-\n-        Map<String, String> params = serviceInstance.getMetadata();\n-        params.keySet().stream()\n-                .map(k -> k + \"=\" + params.get(k))\n-                .forEach(tags::add);\n-\n-        tags.addAll(registeringTags);\n-        return tags;\n-    }\n-\n-    private Map<String, String> buildMetadata(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = new LinkedHashMap<>();\n-        metadata.putAll(getScCompatibleMetadata(registeringTags));\n-        if (CollectionUtils.isNotEmptyMap(serviceInstance.getMetadata())) {\n-            metadata.putAll(serviceInstance.getMetadata());\n-        }\n-        metadata = encodeMetadata(metadata);\n-        return metadata;\n-    }\n-\n-    private Map<String, String> encodeMetadata(Map<String, String> metadata) {\n-        if (metadata == null) {\n-            return metadata;\n-        }\n-        Map<String, String> encoded = new HashMap<>(metadata.size());\n-        metadata.forEach((k, v) -> encoded.put(Base64.getEncoder().encodeToString(k.getBytes()), v));\n-        return encoded;\n-    }\n-\n-    private Map<String, String> decodeMetadata(Map<String, String> metadata) {\n-        if (metadata == null) {\n-            return metadata;\n-        }\n-        Map<String, String> decoded = new HashMap<>(metadata.size());\n-        metadata.forEach((k, v) -> decoded.put(new String(Base64.getDecoder().decode(k)), v));\n-        return decoded;\n-    }\n-\n-    private NewService.Check buildCheck(ServiceInstance serviceInstance) {\n-        NewService.Check check = new NewService.Check();\n-        check.setTtl((checkPassInterval / 1000) + \"s\");\n-        String deregister = serviceInstance.getMetadata().get(DEREGISTER_AFTER);\n-        check.setDeregisterCriticalServiceAfter(deregister == null ? DEFAULT_DEREGISTER_TIME : deregister);\n-        return check;\n-    }\n-\n-    private int buildWatchTimeout() {\n-        return url.getParameter(WATCH_TIMEOUT, DEFAULT_WATCH_TIMEOUT) / 1000;\n-    }\n-\n-    private class ConsulNotifier implements Runnable {\n-        private String serviceName;\n-        private long consulIndex;\n-        private boolean running;\n-\n-        ConsulNotifier(String serviceName, long consulIndex) {\n-            this.serviceName = serviceName;\n-            this.consulIndex = consulIndex;\n-            this.running = true;\n-        }\n-\n-        @Override\n-        public void run() {\n-            while (this.running) {\n-                processService();\n-            }\n-        }\n-\n-        private void processService() {\n-            Response<List<HealthService>> response = getHealthServices(serviceName, consulIndex, Integer.MAX_VALUE);\n-            Long currentIndex = response.getConsulIndex();\n-            if (currentIndex != null && currentIndex > consulIndex) {\n-                consulIndex = currentIndex;\n-                List<HealthService> services = response.getValue();\n-                List<ServiceInstance> serviceInstances = convert(services);\n-                dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);\n-            }\n-        }\n-\n-        void stop() {\n-            this.running = false;\n-        }\n-    }\n-\n-    private static class TtlScheduler {\n-\n-        private static final Logger logger = LoggerFactory.getLogger(TtlScheduler.class);\n-\n-        private final Map<String, ScheduledFuture> serviceHeartbeats = new ConcurrentHashMap<>();\n-\n-        private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();\n-\n-        private long checkInterval;\n-\n-        private ConsulClient client;\n-\n-        public TtlScheduler(long checkInterval, ConsulClient client) {\n-            this.checkInterval = checkInterval;\n-            this.client = client;\n-        }\n-\n-        /**\n-         * Add a service to the checks loop.\n-         *\n-         * @param instanceId instance id\n-         */\n-        public void add(String instanceId) {\n-            ScheduledFuture task = this.scheduler.scheduleAtFixedRate(\n-                    new ConsulHeartbeatTask(instanceId),\n-                    checkInterval / 8,\n-                    checkInterval / 8,\n-                    TimeUnit.MILLISECONDS);\n-            ScheduledFuture previousTask = this.serviceHeartbeats.put(instanceId, task);\n-            if (previousTask != null) {\n-                previousTask.cancel(true);\n-            }\n-        }\n-\n-        public void remove(String instanceId) {\n-            ScheduledFuture task = this.serviceHeartbeats.get(instanceId);\n-            if (task != null) {\n-                task.cancel(true);\n-            }\n-            this.serviceHeartbeats.remove(instanceId);\n-        }\n-\n-        private class ConsulHeartbeatTask implements Runnable {\n-\n-            private String checkId;\n-\n-            ConsulHeartbeatTask(String serviceId) {\n-                this.checkId = serviceId;\n-                if (!this.checkId.startsWith(\"service:\")) {\n-                    this.checkId = \"service:\" + this.checkId;\n-                }\n-            }\n-\n-            @Override\n-            public void run() {\n-                TtlScheduler.this.client.agentCheckPass(this.checkId);\n-                if (logger.isDebugEnabled()) {\n-                    logger.debug(\"Sending consul heartbeat for: \" + this.checkId);\n-                }\n-            }\n-\n-        }\n-\n-        public void stop() {\n-            scheduler.shutdownNow();\n-        }\n-\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import com.ecwid.consul.v1.ConsistencyMode;\r\n+import com.ecwid.consul.v1.ConsulClient;\r\n+import com.ecwid.consul.v1.QueryParams;\r\n+import com.ecwid.consul.v1.Response;\r\n+import com.ecwid.consul.v1.agent.model.NewService;\r\n+import com.ecwid.consul.v1.catalog.CatalogServicesRequest;\r\n+import com.ecwid.consul.v1.health.HealthServicesRequest;\r\n+import com.ecwid.consul.v1.health.model.HealthService;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.Base64;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.Executors;\r\n+import java.util.concurrent.ScheduledExecutorService;\r\n+import java.util.concurrent.ScheduledFuture;\r\n+import java.util.concurrent.TimeUnit;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.util.concurrent.Executors.newCachedThreadPool;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.CHECK_PASS_INTERVAL;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_CHECK_PASS_INTERVAL;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_DEREGISTER_TIME;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_PORT;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEFAULT_WATCH_TIMEOUT;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.DEREGISTER_AFTER;\r\n+import static org.apache.dubbo.registry.consul.AbstractConsulRegistry.WATCH_TIMEOUT;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.ACL_TOKEN;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.CONSISTENCY_MODE;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.DEFAULT_ZONE_METADATA_NAME;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.INSTANCE_GROUP;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.INSTANCE_ZONE;\r\n+import static org.apache.dubbo.registry.consul.ConsulParameter.TAGS;\r\n+\r\n+/**\r\n+ * 2019-07-31\r\n+ */\r\n+public class ConsulServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(ConsulServiceDiscovery.class);\r\n+\r\n+    private static final String QUERY_TAG = \"consul_query_tag\";\r\n+    private static final String REGISTER_TAG = \"consul_register_tag\";\r\n+\r\n+    private List<String> registeringTags = new ArrayList<>();\r\n+    private String tag;\r\n+    private ConsulClient client;\r\n+    private ExecutorService notifierExecutor = newCachedThreadPool(\r\n+            new NamedThreadFactory(\"dubbo-service-discovery-consul-notifier\", true));\r\n+    private Map<String, ConsulNotifier> notifiers = new ConcurrentHashMap<>();\r\n+    private TtlScheduler ttlScheduler;\r\n+    private long checkPassInterval;\r\n+    private URL url;\r\n+\r\n+    private String aclToken;\r\n+\r\n+    private List<String> tags;\r\n+\r\n+    private ConsistencyMode consistencyMode;\r\n+\r\n+    private String defaultZoneMetadataName;\r\n+\r\n+    /**\r\n+     * Service instance zone.\r\n+     */\r\n+    private String instanceZone;\r\n+\r\n+    /**\r\n+     * Service instance group.\r\n+     */\r\n+    private String instanceGroup;\r\n+\r\n+\r\n+    @Override\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        this.url = registryURL;\r\n+        String host = url.getHost();\r\n+        int port = url.getPort() != 0 ? url.getPort() : DEFAULT_PORT;\r\n+        checkPassInterval = url.getParameter(CHECK_PASS_INTERVAL, DEFAULT_CHECK_PASS_INTERVAL);\r\n+        client = new ConsulClient(host, port);\r\n+        ttlScheduler = new TtlScheduler(checkPassInterval, client);\r\n+        this.tag = registryURL.getParameter(QUERY_TAG);\r\n+        this.registeringTags.addAll(getRegisteringTags(url));\r\n+        this.aclToken = ACL_TOKEN.getValue(registryURL);\r\n+        this.tags = getTags(registryURL);\r\n+        this.consistencyMode = getConsistencyMode(registryURL);\r\n+        this.defaultZoneMetadataName = DEFAULT_ZONE_METADATA_NAME.getValue(registryURL);\r\n+        this.instanceZone = INSTANCE_ZONE.getValue(registryURL);\r\n+        this.instanceGroup = INSTANCE_GROUP.getValue(registryURL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link ConsistencyMode}\r\n+     *\r\n+     * @param registryURL the {@link URL} of registry\r\n+     * @return non-null, {@link ConsistencyMode#DEFAULT} as default\r\n+     * @sine 2.7.8\r\n+     */\r\n+    private ConsistencyMode getConsistencyMode(URL registryURL) {\r\n+        String value = CONSISTENCY_MODE.getValue(registryURL);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            return ConsistencyMode.valueOf(value);\r\n+        }\r\n+        return ConsistencyMode.DEFAULT;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the \"tags\" from the {@link URL} of registry\r\n+     *\r\n+     * @param registryURL the {@link URL} of registry\r\n+     * @return non-null\r\n+     * @sine 2.7.8\r\n+     */\r\n+    private List<String> getTags(URL registryURL) {\r\n+        String value = TAGS.getValue(registryURL);\r\n+        return StringUtils.splitToList(value, COMMA_SEPARATOR_CHAR);\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return url;\r\n+    }\r\n+\r\n+    private List<String> getRegisteringTags(URL url) {\r\n+        List<String> tags = new ArrayList<>();\r\n+        String rawTag = url.getParameter(REGISTER_TAG);\r\n+        if (StringUtils.isNotEmpty(rawTag)) {\r\n+            tags.addAll(Arrays.asList(SEMICOLON_SPLIT_PATTERN.split(rawTag)));\r\n+        }\r\n+        return tags;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        notifiers.forEach((_k, notifier) -> {\r\n+            if (notifier != null) {\r\n+                notifier.stop();\r\n+            }\r\n+        });\r\n+        notifiers.clear();\r\n+        notifierExecutor.shutdownNow();\r\n+        ttlScheduler.stop();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        NewService consulService = buildService(serviceInstance);\r\n+        ttlScheduler.add(consulService.getId());\r\n+        client.agentServiceRegister(consulService, aclToken);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\r\n+        Set<String> serviceNames = listener.getServiceNames();\r\n+        for (String serviceName : serviceNames) {\r\n+            ConsulNotifier notifier = notifiers.get(serviceName);\r\n+            if (notifier == null) {\r\n+                Response<List<HealthService>> response = getHealthServices(serviceName, -1, buildWatchTimeout());\r\n+                Long consulIndex = response.getConsulIndex();\r\n+                notifier = new ConsulNotifier(serviceName, consulIndex);\r\n+            }\r\n+            notifierExecutor.execute(notifier);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        // TODO\r\n+        // client.catalogRegister(buildCatalogService(serviceInstance));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        String id = buildId(serviceInstance);\r\n+        ttlScheduler.remove(id);\r\n+        client.agentServiceDeregister(id, aclToken);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        CatalogServicesRequest request = CatalogServicesRequest.newBuilder()\r\n+                .setQueryParams(QueryParams.DEFAULT)\r\n+                .setToken(aclToken)\r\n+                .build();\r\n+        return this.client.getCatalogServices(request).getValue().keySet();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+        Response<List<HealthService>> response = getHealthServices(serviceName, -1, buildWatchTimeout());\r\n+        Long consulIndex = response.getConsulIndex();\r\n+        ConsulNotifier notifier = notifiers.get(serviceName);\r\n+        if (notifier == null) {\r\n+            notifier = new ConsulNotifier(serviceName, consulIndex);\r\n+            notifiers.put(serviceName, notifier);\r\n+        }\r\n+        return convert(response.getValue());\r\n+    }\r\n+\r\n+    private List<ServiceInstance> convert(List<HealthService> services) {\r\n+        return services.stream()\r\n+                .map(HealthService::getService)\r\n+                .map(service -> {\r\n+                    ServiceInstance instance = new DefaultServiceInstance(\r\n+                            service.getId(),\r\n+                            service.getService(),\r\n+                            service.getAddress(),\r\n+                            service.getPort());\r\n+                    instance.getMetadata().putAll(getMetadata(service));\r\n+                    return instance;\r\n+                })\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    private Response<List<HealthService>> getHealthServices(String service, long index, int watchTimeout) {\r\n+        HealthServicesRequest request = HealthServicesRequest.newBuilder()\r\n+                .setTag(tag)\r\n+                .setQueryParams(new QueryParams(watchTimeout, index))\r\n+                .setPassing(true)\r\n+                .build();\r\n+        return client.getHealthServices(service, request);\r\n+    }\r\n+\r\n+    private Map<String, String> getMetadata(HealthService.Service service) {\r\n+        Map<String, String> metadata = service.getMeta();\r\n+        metadata = decodeMetadata(metadata);\r\n+        if (CollectionUtils.isEmptyMap(metadata)) {\r\n+            metadata = getScCompatibleMetadata(service.getTags());\r\n+        }\r\n+        return metadata;\r\n+    }\r\n+\r\n+    private Map<String, String> getScCompatibleMetadata(List<String> tags) {\r\n+        LinkedHashMap<String, String> metadata = new LinkedHashMap<>();\r\n+        if (tags != null) {\r\n+            for (String tag : tags) {\r\n+                String[] parts = StringUtils.delimitedListToStringArray(tag, \"=\");\r\n+                switch (parts.length) {\r\n+                    case 0:\r\n+                        break;\r\n+                    case 1:\r\n+                        metadata.put(parts[0], parts[0]);\r\n+                        break;\r\n+                    case 2:\r\n+                        metadata.put(parts[0], parts[1]);\r\n+                        break;\r\n+                    default:\r\n+                        String[] end = Arrays.copyOfRange(parts, 1, parts.length);\r\n+                        metadata.put(parts[0], StringUtils.arrayToDelimitedString(end, \"=\"));\r\n+                        break;\r\n+                }\r\n+\r\n+            }\r\n+        }\r\n+\r\n+        return metadata;\r\n+    }\r\n+\r\n+    private NewService buildService(ServiceInstance serviceInstance) {\r\n+        NewService service = new NewService();\r\n+        service.setAddress(serviceInstance.getHost());\r\n+        service.setPort(serviceInstance.getPort());\r\n+        service.setId(buildId(serviceInstance));\r\n+        service.setName(serviceInstance.getServiceName());\r\n+        service.setCheck(buildCheck(serviceInstance));\r\n+        service.setTags(buildTags(serviceInstance));\r\n+        return service;\r\n+    }\r\n+\r\n+    private String buildId(ServiceInstance serviceInstance) {\r\n+        return Integer.toHexString(serviceInstance.hashCode());\r\n+    }\r\n+\r\n+    private List<String> buildTags(ServiceInstance serviceInstance) {\r\n+        List<String> tags = new LinkedList<>(this.tags);\r\n+\r\n+        if (StringUtils.isNotEmpty(instanceZone)) {\r\n+            tags.add(defaultZoneMetadataName + \"=\" + instanceZone);\r\n+        }\r\n+\r\n+        if (StringUtils.isNotEmpty(instanceGroup)) {\r\n+            tags.add(\"group=\" + instanceGroup);\r\n+        }\r\n+\r\n+        Map<String, String> params = serviceInstance.getMetadata();\r\n+        params.keySet().stream()\r\n+                .map(k -> k + \"=\" + params.get(k))\r\n+                .forEach(tags::add);\r\n+\r\n+        tags.addAll(registeringTags);\r\n+        return tags;\r\n+    }\r\n+\r\n+    private Map<String, String> buildMetadata(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = new LinkedHashMap<>();\r\n+        metadata.putAll(getScCompatibleMetadata(registeringTags));\r\n+        if (CollectionUtils.isNotEmptyMap(serviceInstance.getMetadata())) {\r\n+            metadata.putAll(serviceInstance.getMetadata());\r\n+        }\r\n+        metadata = encodeMetadata(metadata);\r\n+        return metadata;\r\n+    }\r\n+\r\n+    private Map<String, String> encodeMetadata(Map<String, String> metadata) {\r\n+        if (metadata == null) {\r\n+            return metadata;\r\n+        }\r\n+        Map<String, String> encoded = new HashMap<>(metadata.size());\r\n+        metadata.forEach((k, v) -> encoded.put(Base64.getEncoder().encodeToString(k.getBytes()), v));\r\n+        return encoded;\r\n+    }\r\n+\r\n+    private Map<String, String> decodeMetadata(Map<String, String> metadata) {\r\n+        if (metadata == null) {\r\n+            return metadata;\r\n+        }\r\n+        Map<String, String> decoded = new HashMap<>(metadata.size());\r\n+        metadata.forEach((k, v) -> decoded.put(new String(Base64.getDecoder().decode(k)), v));\r\n+        return decoded;\r\n+    }\r\n+\r\n+    private NewService.Check buildCheck(ServiceInstance serviceInstance) {\r\n+        NewService.Check check = new NewService.Check();\r\n+        check.setTtl((checkPassInterval / 1000) + \"s\");\r\n+        String deregister = serviceInstance.getMetadata().get(DEREGISTER_AFTER);\r\n+        check.setDeregisterCriticalServiceAfter(deregister == null ? DEFAULT_DEREGISTER_TIME : deregister);\r\n+        return check;\r\n+    }\r\n+\r\n+    private int buildWatchTimeout() {\r\n+        return url.getParameter(WATCH_TIMEOUT, DEFAULT_WATCH_TIMEOUT) / 1000;\r\n+    }\r\n+\r\n+    private class ConsulNotifier implements Runnable {\r\n+        private String serviceName;\r\n+        private long consulIndex;\r\n+        private boolean running;\r\n+\r\n+        ConsulNotifier(String serviceName, long consulIndex) {\r\n+            this.serviceName = serviceName;\r\n+            this.consulIndex = consulIndex;\r\n+            this.running = true;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void run() {\r\n+            while (this.running) {\r\n+                processService();\r\n+            }\r\n+        }\r\n+\r\n+        private void processService() {\r\n+            Response<List<HealthService>> response = getHealthServices(serviceName, consulIndex, Integer.MAX_VALUE);\r\n+            Long currentIndex = response.getConsulIndex();\r\n+            if (currentIndex != null && currentIndex > consulIndex) {\r\n+                consulIndex = currentIndex;\r\n+                List<HealthService> services = response.getValue();\r\n+                List<ServiceInstance> serviceInstances = convert(services);\r\n+                dispatchServiceInstancesChangedEvent(serviceName, serviceInstances);\r\n+            }\r\n+        }\r\n+\r\n+        void stop() {\r\n+            this.running = false;\r\n+        }\r\n+    }\r\n+\r\n+    private static class TtlScheduler {\r\n+\r\n+        private static final Logger logger = LoggerFactory.getLogger(TtlScheduler.class);\r\n+\r\n+        private final Map<String, ScheduledFuture> serviceHeartbeats = new ConcurrentHashMap<>();\r\n+\r\n+        private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();\r\n+\r\n+        private long checkInterval;\r\n+\r\n+        private ConsulClient client;\r\n+\r\n+        public TtlScheduler(long checkInterval, ConsulClient client) {\r\n+            this.checkInterval = checkInterval;\r\n+            this.client = client;\r\n+        }\r\n+\r\n+        /**\r\n+         * Add a service to the checks loop.\r\n+         *\r\n+         * @param instanceId instance id\r\n+         */\r\n+        public void add(String instanceId) {\r\n+            ScheduledFuture task = this.scheduler.scheduleAtFixedRate(\r\n+                    new ConsulHeartbeatTask(instanceId),\r\n+                    checkInterval / 8,\r\n+                    checkInterval / 8,\r\n+                    TimeUnit.MILLISECONDS);\r\n+            ScheduledFuture previousTask = this.serviceHeartbeats.put(instanceId, task);\r\n+            if (previousTask != null) {\r\n+                previousTask.cancel(true);\r\n+            }\r\n+        }\r\n+\r\n+        public void remove(String instanceId) {\r\n+            ScheduledFuture task = this.serviceHeartbeats.get(instanceId);\r\n+            if (task != null) {\r\n+                task.cancel(true);\r\n+            }\r\n+            this.serviceHeartbeats.remove(instanceId);\r\n+        }\r\n+\r\n+        private class ConsulHeartbeatTask implements Runnable {\r\n+\r\n+            private String checkId;\r\n+\r\n+            ConsulHeartbeatTask(String serviceId) {\r\n+                this.checkId = serviceId;\r\n+                if (!this.checkId.startsWith(\"service:\")) {\r\n+                    this.checkId = \"service:\" + this.checkId;\r\n+                }\r\n+            }\r\n+\r\n+            @Override\r\n+            public void run() {\r\n+                TtlScheduler.this.client.agentCheckPass(this.checkId);\r\n+                if (logger.isDebugEnabled()) {\r\n+                    logger.debug(\"Sending consul heartbeat for: \" + this.checkId);\r\n+                }\r\n+            }\r\n+\r\n+        }\r\n+\r\n+        public void stop() {\r\n+            scheduler.shutdownNow();\r\n+        }\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        return new ConsulServiceDiscovery();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        return new ConsulServiceDiscovery();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD", "source2": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        return new ConsulServiceDiscovery();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        return new ConsulServiceDiscovery();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master", "source2": "org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master", "comments": ["Line-ending differences only"], "unified_diff": "@@ -1,30 +1,30 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.consul;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        return new ConsulServiceDiscovery();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.consul;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+public class ConsulServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        return new ConsulServiceDiscovery();\r\n+    }\r\n+\r\n+}\r\n"}]}
