{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 22337 bytes, number of entries: 27\n+Zip file size: 22437 bytes, number of entries: 27\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/consul/\n@@ -10,20 +10,20 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/dubbo/internal/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/\n -rw-r--r--  2.0 unx     4792 b- defN 20-Apr-01 08:04 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 20-Apr-01 08:04 META-INF/LICENSE\n -rw-r--r--  2.0 unx      178 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1601 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/AbstractConsulRegistry.java\n--rw-r--r--  2.0 unx     2515 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulParameter.java\n--rw-r--r--  2.0 unx    14467 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulRegistry.java\n--rw-r--r--  2.0 unx     1233 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulRegistryFactory.java\n--rw-r--r--  2.0 unx    18301 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java\n--rw-r--r--  2.0 unx     1233 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java\n--rw-r--r--  2.0 unx     1233 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD\n--rw-r--r--  2.0 unx     1233 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master\n+-rw-r--r--  2.0 unx     1640 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/AbstractConsulRegistry.java\n+-rw-r--r--  2.0 unx     2602 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulParameter.java\n+-rw-r--r--  2.0 unx    14847 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulRegistry.java\n+-rw-r--r--  2.0 unx     1265 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulRegistryFactory.java\n+-rw-r--r--  2.0 unx    18782 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java\n+-rw-r--r--  2.0 unx     1263 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx     1263 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~HEAD\n+-rw-r--r--  2.0 unx     1263 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java~dubbo-master\n -rw-r--r--  2.0 unx       63 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw-r--r--  2.0 unx       69 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n--rw-r--r--  2.0 unx     2450 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml\n+-rw-r--r--  2.0 unx     2385 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.xml\n -rw-r--r--  2.0 unx       76 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-consul/pom.properties\n-27 files, 60866 bytes uncompressed, 18085 bytes compressed:  70.3%\n+27 files, 61910 bytes uncompressed, 18185 bytes compressed:  70.6%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -281,1090 +281,1090 @@\n 1716 Extract Zip Spec      14 (20) '2.0'\n 1717 Extract OS            00 (0) 'MS-DOS'\n 1718 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 171A Compression Method    0008 (8) 'Deflated'\n 171C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1720 CRC                   DD92E439 (3717391417)\n-1724 Compressed Size       00000315 (789)\n-1728 Uncompressed Size     00000641 (1601)\n+1720 CRC                   5B9C99AA (1536989610)\n+1724 Compressed Size       00000321 (801)\n+1728 Uncompressed Size     00000668 (1640)\n 172C Filename Length       003C (60)\n 172E Extra Length          0000 (0)\n 1730 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x1730: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 176C PAYLOAD\n \n-1A81 LOCAL HEADER #17      04034B50 (67324752)\n-1A85 Extract Zip Spec      14 (20) '2.0'\n-1A86 Extract OS            00 (0) 'MS-DOS'\n-1A87 General Purpose Flag  0800 (2048)\n+1A8D LOCAL HEADER #17      04034B50 (67324752)\n+1A91 Extract Zip Spec      14 (20) '2.0'\n+1A92 Extract OS            00 (0) 'MS-DOS'\n+1A93 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-1A89 Compression Method    0008 (8) 'Deflated'\n-1A8B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1A8F CRC                   1FAE29F0 (531507696)\n-1A93 Compressed Size       000003E5 (997)\n-1A97 Uncompressed Size     000009D3 (2515)\n-1A9B Filename Length       0035 (53)\n-1A9D Extra Length          0000 (0)\n-1A9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1A95 Compression Method    0008 (8) 'Deflated'\n+1A97 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1A9B CRC                   050B43B2 (84624306)\n+1A9F Compressed Size       000003EF (1007)\n+1AA3 Uncompressed Size     00000A2A (2602)\n+1AA7 Filename Length       0035 (53)\n+1AA9 Extra Length          0000 (0)\n+1AAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1A9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1AAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1AD4 PAYLOAD\n+1AE0 PAYLOAD\n \n-1EB9 LOCAL HEADER #18      04034B50 (67324752)\n-1EBD Extract Zip Spec      14 (20) '2.0'\n-1EBE Extract OS            00 (0) 'MS-DOS'\n-1EBF General Purpose Flag  0800 (2048)\n+1ECF LOCAL HEADER #18      04034B50 (67324752)\n+1ED3 Extract Zip Spec      14 (20) '2.0'\n+1ED4 Extract OS            00 (0) 'MS-DOS'\n+1ED5 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-1EC1 Compression Method    0008 (8) 'Deflated'\n-1EC3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1EC7 CRC                   CF695E4A (3479789130)\n-1ECB Compressed Size       00000D24 (3364)\n-1ECF Uncompressed Size     00003883 (14467)\n-1ED3 Filename Length       0034 (52)\n-1ED5 Extra Length          0000 (0)\n-1ED7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1ED7 Compression Method    0008 (8) 'Deflated'\n+1ED9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EDD CRC                   C548D865 (3309885541)\n+1EE1 Compressed Size       00000D3A (3386)\n+1EE5 Uncompressed Size     000039FF (14847)\n+1EE9 Filename Length       0034 (52)\n+1EEB Extra Length          0000 (0)\n+1EED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1ED7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F0B PAYLOAD\n+1F21 PAYLOAD\n \n-2C2F LOCAL HEADER #19      04034B50 (67324752)\n-2C33 Extract Zip Spec      14 (20) '2.0'\n-2C34 Extract OS            00 (0) 'MS-DOS'\n-2C35 General Purpose Flag  0800 (2048)\n+2C5B LOCAL HEADER #19      04034B50 (67324752)\n+2C5F Extract Zip Spec      14 (20) '2.0'\n+2C60 Extract OS            00 (0) 'MS-DOS'\n+2C61 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-2C37 Compression Method    0008 (8) 'Deflated'\n-2C39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2C3D CRC                   EE6324FC (3999474940)\n-2C41 Compressed Size       00000273 (627)\n-2C45 Uncompressed Size     000004D1 (1233)\n-2C49 Filename Length       003B (59)\n-2C4B Extra Length          0000 (0)\n-2C4D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2C63 Compression Method    0008 (8) 'Deflated'\n+2C65 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2C69 CRC                   F93C1E65 (4181466725)\n+2C6D Compressed Size       0000027B (635)\n+2C71 Uncompressed Size     000004F1 (1265)\n+2C75 Filename Length       003B (59)\n+2C77 Extra Length          0000 (0)\n+2C79 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C4D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C79: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2C88 PAYLOAD\n+2CB4 PAYLOAD\n \n-2EFB LOCAL HEADER #20      04034B50 (67324752)\n-2EFF Extract Zip Spec      14 (20) '2.0'\n-2F00 Extract OS            00 (0) 'MS-DOS'\n-2F01 General Purpose Flag  0800 (2048)\n+2F2F LOCAL HEADER #20      04034B50 (67324752)\n+2F33 Extract Zip Spec      14 (20) '2.0'\n+2F34 Extract OS            00 (0) 'MS-DOS'\n+2F35 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-2F03 Compression Method    0008 (8) 'Deflated'\n-2F05 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2F09 CRC                   8A186986 (2316855686)\n-2F0D Compressed Size       0000105B (4187)\n-2F11 Uncompressed Size     0000477D (18301)\n-2F15 Filename Length       003C (60)\n-2F17 Extra Length          0000 (0)\n-2F19 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2F37 Compression Method    0008 (8) 'Deflated'\n+2F39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2F3D CRC                   1758261F (391652895)\n+2F41 Compressed Size       00001076 (4214)\n+2F45 Uncompressed Size     0000495E (18782)\n+2F49 Filename Length       003C (60)\n+2F4B Extra Length          0000 (0)\n+2F4D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2F19: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2F4D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2F55 PAYLOAD\n+2F89 PAYLOAD\n \n-3FB0 LOCAL HEADER #21      04034B50 (67324752)\n-3FB4 Extract Zip Spec      14 (20) '2.0'\n-3FB5 Extract OS            00 (0) 'MS-DOS'\n-3FB6 General Purpose Flag  0800 (2048)\n+3FFF LOCAL HEADER #21      04034B50 (67324752)\n+4003 Extract Zip Spec      14 (20) '2.0'\n+4004 Extract OS            00 (0) 'MS-DOS'\n+4005 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3FB8 Compression Method    0008 (8) 'Deflated'\n-3FBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3FBE CRC                   35541C2F (894704687)\n-3FC2 Compressed Size       00000263 (611)\n-3FC6 Uncompressed Size     000004D1 (1233)\n-3FCA Filename Length       0043 (67)\n-3FCC Extra Length          0000 (0)\n-3FCE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4007 Compression Method    0008 (8) 'Deflated'\n+4009 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+400D CRC                   09B44E50 (162811472)\n+4011 Compressed Size       0000026C (620)\n+4015 Uncompressed Size     000004EF (1263)\n+4019 Filename Length       0043 (67)\n+401B Extra Length          0000 (0)\n+401D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3FCE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x401D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4011 PAYLOAD\n+4060 PAYLOAD\n \n-4274 LOCAL HEADER #22      04034B50 (67324752)\n-4278 Extract Zip Spec      14 (20) '2.0'\n-4279 Extract OS            00 (0) 'MS-DOS'\n-427A General Purpose Flag  0800 (2048)\n+42CC LOCAL HEADER #22      04034B50 (67324752)\n+42D0 Extract Zip Spec      14 (20) '2.0'\n+42D1 Extract OS            00 (0) 'MS-DOS'\n+42D2 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-427C Compression Method    0008 (8) 'Deflated'\n-427E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4282 CRC                   35541C2F (894704687)\n-4286 Compressed Size       00000263 (611)\n-428A Uncompressed Size     000004D1 (1233)\n-428E Filename Length       0048 (72)\n-4290 Extra Length          0000 (0)\n-4292 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+42D4 Compression Method    0008 (8) 'Deflated'\n+42D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+42DA CRC                   09B44E50 (162811472)\n+42DE Compressed Size       0000026C (620)\n+42E2 Uncompressed Size     000004EF (1263)\n+42E6 Filename Length       0048 (72)\n+42E8 Extra Length          0000 (0)\n+42EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4292: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-42DA PAYLOAD\n+4332 PAYLOAD\n \n-453D LOCAL HEADER #23      04034B50 (67324752)\n-4541 Extract Zip Spec      14 (20) '2.0'\n-4542 Extract OS            00 (0) 'MS-DOS'\n-4543 General Purpose Flag  0800 (2048)\n+459E LOCAL HEADER #23      04034B50 (67324752)\n+45A2 Extract Zip Spec      14 (20) '2.0'\n+45A3 Extract OS            00 (0) 'MS-DOS'\n+45A4 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4545 Compression Method    0008 (8) 'Deflated'\n-4547 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-454B CRC                   35541C2F (894704687)\n-454F Compressed Size       00000263 (611)\n-4553 Uncompressed Size     000004D1 (1233)\n-4557 Filename Length       0050 (80)\n-4559 Extra Length          0000 (0)\n-455B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+45A6 Compression Method    0008 (8) 'Deflated'\n+45A8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+45AC CRC                   09B44E50 (162811472)\n+45B0 Compressed Size       0000026C (620)\n+45B4 Uncompressed Size     000004EF (1263)\n+45B8 Filename Length       0050 (80)\n+45BA Extra Length          0000 (0)\n+45BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x455B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x45BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-45AB PAYLOAD\n+460C PAYLOAD\n \n-480E LOCAL HEADER #24      04034B50 (67324752)\n-4812 Extract Zip Spec      14 (20) '2.0'\n-4813 Extract OS            00 (0) 'MS-DOS'\n-4814 General Purpose Flag  0800 (2048)\n+4878 LOCAL HEADER #24      04034B50 (67324752)\n+487C Extract Zip Spec      14 (20) '2.0'\n+487D Extract OS            00 (0) 'MS-DOS'\n+487E General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4816 Compression Method    0008 (8) 'Deflated'\n-4818 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-481C CRC                   8BCE1404 (2345538564)\n-4820 Compressed Size       00000035 (53)\n-4824 Uncompressed Size     0000003F (63)\n-4828 Filename Length       0041 (65)\n-482A Extra Length          0000 (0)\n-482C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4880 Compression Method    0008 (8) 'Deflated'\n+4882 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4886 CRC                   8BCE1404 (2345538564)\n+488A Compressed Size       00000035 (53)\n+488E Uncompressed Size     0000003F (63)\n+4892 Filename Length       0041 (65)\n+4894 Extra Length          0000 (0)\n+4896 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x482C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4896: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-486D PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+48D7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-48A2 LOCAL HEADER #25      04034B50 (67324752)\n-48A6 Extract Zip Spec      14 (20) '2.0'\n-48A7 Extract OS            00 (0) 'MS-DOS'\n-48A8 General Purpose Flag  0800 (2048)\n+490C LOCAL HEADER #25      04034B50 (67324752)\n+4910 Extract Zip Spec      14 (20) '2.0'\n+4911 Extract OS            00 (0) 'MS-DOS'\n+4912 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-48AA Compression Method    0008 (8) 'Deflated'\n-48AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-48B0 CRC                   FA6D0539 (4201448761)\n-48B4 Compressed Size       00000040 (64)\n-48B8 Uncompressed Size     00000045 (69)\n-48BC Filename Length       0050 (80)\n-48BE Extra Length          0000 (0)\n-48C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4914 Compression Method    0008 (8) 'Deflated'\n+4916 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+491A CRC                   FA6D0539 (4201448761)\n+491E Compressed Size       00000040 (64)\n+4922 Uncompressed Size     00000045 (69)\n+4926 Filename Length       0050 (80)\n+4928 Extra Length          0000 (0)\n+492A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x492A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4910 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+497A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-4950 LOCAL HEADER #26      04034B50 (67324752)\n-4954 Extract Zip Spec      14 (20) '2.0'\n-4955 Extract OS            00 (0) 'MS-DOS'\n-4956 General Purpose Flag  0800 (2048)\n+49BA LOCAL HEADER #26      04034B50 (67324752)\n+49BE Extract Zip Spec      14 (20) '2.0'\n+49BF Extract OS            00 (0) 'MS-DOS'\n+49C0 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4958 Compression Method    0008 (8) 'Deflated'\n-495A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-495E CRC                   178839D9 (394803673)\n-4962 Compressed Size       000003B9 (953)\n-4966 Uncompressed Size     00000992 (2450)\n-496A Filename Length       003D (61)\n-496C Extra Length          0000 (0)\n-496E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49C2 Compression Method    0008 (8) 'Deflated'\n+49C4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+49C8 CRC                   136E4489 (325993609)\n+49CC Compressed Size       000003B3 (947)\n+49D0 Uncompressed Size     00000951 (2385)\n+49D4 Filename Length       003D (61)\n+49D6 Extra Length          0000 (0)\n+49D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x496E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-49AB PAYLOAD\n+4A15 PAYLOAD\n \n-4D64 LOCAL HEADER #27      04034B50 (67324752)\n-4D68 Extract Zip Spec      14 (20) '2.0'\n-4D69 Extract OS            00 (0) 'MS-DOS'\n-4D6A General Purpose Flag  0800 (2048)\n+4DC8 LOCAL HEADER #27      04034B50 (67324752)\n+4DCC Extract Zip Spec      14 (20) '2.0'\n+4DCD Extract OS            00 (0) 'MS-DOS'\n+4DCE General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4D6C Compression Method    0008 (8) 'Deflated'\n-4D6E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4D72 CRC                   153432AD (355742381)\n-4D76 Compressed Size       0000004A (74)\n-4D7A Uncompressed Size     0000004C (76)\n-4D7E Filename Length       0044 (68)\n-4D80 Extra Length          0000 (0)\n-4D82 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4DD0 Compression Method    0008 (8) 'Deflated'\n+4DD2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4DD6 CRC                   153432AD (355742381)\n+4DDA Compressed Size       0000004A (74)\n+4DDE Uncompressed Size     0000004C (76)\n+4DE2 Filename Length       0044 (68)\n+4DE4 Extra Length          0000 (0)\n+4DE6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4D82: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4DE6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-4DC6 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+4E2A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-4E10 CENTRAL HEADER #1     02014B50 (33639248)\n-4E14 Created Zip Spec      14 (20) '2.0'\n-4E15 Created OS            03 (3) 'Unix'\n-4E16 Extract Zip Spec      14 (20) '2.0'\n-4E17 Extract OS            00 (0) 'MS-DOS'\n-4E18 General Purpose Flag  0800 (2048)\n+4E74 CENTRAL HEADER #1     02014B50 (33639248)\n+4E78 Created Zip Spec      14 (20) '2.0'\n+4E79 Created OS            03 (3) 'Unix'\n+4E7A Extract Zip Spec      14 (20) '2.0'\n+4E7B Extract OS            00 (0) 'MS-DOS'\n+4E7C General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4E1A Compression Method    0008 (8) 'Deflated'\n-4E1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4E20 CRC                   A689EB18 (2794056472)\n-4E24 Compressed Size       00000042 (66)\n-4E28 Uncompressed Size     00000040 (64)\n-4E2C Filename Length       0014 (20)\n-4E2E Extra Length          0000 (0)\n-4E30 Comment Length        0000 (0)\n-4E32 Disk Start            0000 (0)\n-4E34 Int File Attributes   0000 (0)\n+4E7E Compression Method    0008 (8) 'Deflated'\n+4E80 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4E84 CRC                   A689EB18 (2794056472)\n+4E88 Compressed Size       00000042 (66)\n+4E8C Uncompressed Size     00000040 (64)\n+4E90 Filename Length       0014 (20)\n+4E92 Extra Length          0000 (0)\n+4E94 Comment Length        0000 (0)\n+4E96 Disk Start            0000 (0)\n+4E98 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4E36 Ext File Attributes   81A40000 (2175008768)\n+4E9A Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-4E3A Local Header Offset   00000000 (0)\n-4E3E Filename              'XXXXXXXXXXXXXXXXXXXX'\n+4E9E Local Header Offset   00000000 (0)\n+4EA2 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4E3E: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4EA2: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4E52 CENTRAL HEADER #2     02014B50 (33639248)\n-4E56 Created Zip Spec      14 (20) '2.0'\n-4E57 Created OS            03 (3) 'Unix'\n-4E58 Extract Zip Spec      0A (10) '1.0'\n-4E59 Extract OS            00 (0) 'MS-DOS'\n-4E5A General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4E5C Compression Method    0000 (0) 'Stored'\n-4E5E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4E62 CRC                   00000000 (0)\n-4E66 Compressed Size       00000000 (0)\n-4E6A Uncompressed Size     00000000 (0)\n-4E6E Filename Length       0009 (9)\n-4E70 Extra Length          0000 (0)\n-4E72 Comment Length        0000 (0)\n-4E74 Disk Start            0000 (0)\n-4E76 Int File Attributes   0000 (0)\n+4EB6 CENTRAL HEADER #2     02014B50 (33639248)\n+4EBA Created Zip Spec      14 (20) '2.0'\n+4EBB Created OS            03 (3) 'Unix'\n+4EBC Extract Zip Spec      0A (10) '1.0'\n+4EBD Extract OS            00 (0) 'MS-DOS'\n+4EBE General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4EC0 Compression Method    0000 (0) 'Stored'\n+4EC2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4EC6 CRC                   00000000 (0)\n+4ECA Compressed Size       00000000 (0)\n+4ECE Uncompressed Size     00000000 (0)\n+4ED2 Filename Length       0009 (9)\n+4ED4 Extra Length          0000 (0)\n+4ED6 Comment Length        0000 (0)\n+4ED8 Disk Start            0000 (0)\n+4EDA Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4E78 Ext File Attributes   41ED0010 (1106051088)\n+4EDC Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4E7C Local Header Offset   00000074 (116)\n-4E80 Filename              'XXXXXXXXX'\n+4EE0 Local Header Offset   00000074 (116)\n+4EE4 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x4E80: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x4EE4: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4E80: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4EE4: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4E58: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x4EBC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-4E89 CENTRAL HEADER #3     02014B50 (33639248)\n-4E8D Created Zip Spec      14 (20) '2.0'\n-4E8E Created OS            03 (3) 'Unix'\n-4E8F Extract Zip Spec      0A (10) '1.0'\n-4E90 Extract OS            00 (0) 'MS-DOS'\n-4E91 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4E93 Compression Method    0000 (0) 'Stored'\n-4E95 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4E99 CRC                   00000000 (0)\n-4E9D Compressed Size       00000000 (0)\n-4EA1 Uncompressed Size     00000000 (0)\n-4EA5 Filename Length       0004 (4)\n-4EA7 Extra Length          0000 (0)\n-4EA9 Comment Length        0000 (0)\n-4EAB Disk Start            0000 (0)\n-4EAD Int File Attributes   0000 (0)\n+4EED CENTRAL HEADER #3     02014B50 (33639248)\n+4EF1 Created Zip Spec      14 (20) '2.0'\n+4EF2 Created OS            03 (3) 'Unix'\n+4EF3 Extract Zip Spec      0A (10) '1.0'\n+4EF4 Extract OS            00 (0) 'MS-DOS'\n+4EF5 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4EF7 Compression Method    0000 (0) 'Stored'\n+4EF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4EFD CRC                   00000000 (0)\n+4F01 Compressed Size       00000000 (0)\n+4F05 Uncompressed Size     00000000 (0)\n+4F09 Filename Length       0004 (4)\n+4F0B Extra Length          0000 (0)\n+4F0D Comment Length        0000 (0)\n+4F0F Disk Start            0000 (0)\n+4F11 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4EAF Ext File Attributes   41ED0010 (1106051088)\n+4F13 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4EB3 Local Header Offset   0000009B (155)\n-4EB7 Filename              'XXXX'\n+4F17 Local Header Offset   0000009B (155)\n+4F1B Filename              'XXXX'\n #\n-# WARNING: Offset 0x4EB7: Filename 'XXXX'\n+# WARNING: Offset 0x4F1B: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4EB7: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x4F1B: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4E8F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x4EF3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-4EBB CENTRAL HEADER #4     02014B50 (33639248)\n-4EBF Created Zip Spec      14 (20) '2.0'\n-4EC0 Created OS            03 (3) 'Unix'\n-4EC1 Extract Zip Spec      0A (10) '1.0'\n-4EC2 Extract OS            00 (0) 'MS-DOS'\n-4EC3 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4EC5 Compression Method    0000 (0) 'Stored'\n-4EC7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4ECB CRC                   00000000 (0)\n-4ECF Compressed Size       00000000 (0)\n-4ED3 Uncompressed Size     00000000 (0)\n-4ED7 Filename Length       000B (11)\n-4ED9 Extra Length          0000 (0)\n-4EDB Comment Length        0000 (0)\n-4EDD Disk Start            0000 (0)\n-4EDF Int File Attributes   0000 (0)\n+4F1F CENTRAL HEADER #4     02014B50 (33639248)\n+4F23 Created Zip Spec      14 (20) '2.0'\n+4F24 Created OS            03 (3) 'Unix'\n+4F25 Extract Zip Spec      0A (10) '1.0'\n+4F26 Extract OS            00 (0) 'MS-DOS'\n+4F27 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4F29 Compression Method    0000 (0) 'Stored'\n+4F2B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4F2F CRC                   00000000 (0)\n+4F33 Compressed Size       00000000 (0)\n+4F37 Uncompressed Size     00000000 (0)\n+4F3B Filename Length       000B (11)\n+4F3D Extra Length          0000 (0)\n+4F3F Comment Length        0000 (0)\n+4F41 Disk Start            0000 (0)\n+4F43 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4EE1 Ext File Attributes   41ED0010 (1106051088)\n+4F45 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4EE5 Local Header Offset   000000BD (189)\n-4EE9 Filename              'XXXXXXXXXXX'\n+4F49 Local Header Offset   000000BD (189)\n+4F4D Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4EE9: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x4F4D: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4EE9: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4F4D: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4EC1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x4F25: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-4EF4 CENTRAL HEADER #5     02014B50 (33639248)\n-4EF8 Created Zip Spec      14 (20) '2.0'\n-4EF9 Created OS            03 (3) 'Unix'\n-4EFA Extract Zip Spec      0A (10) '1.0'\n-4EFB Extract OS            00 (0) 'MS-DOS'\n-4EFC General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4EFE Compression Method    0000 (0) 'Stored'\n-4F00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4F04 CRC                   00000000 (0)\n-4F08 Compressed Size       00000000 (0)\n-4F0C Uncompressed Size     00000000 (0)\n-4F10 Filename Length       0011 (17)\n-4F12 Extra Length          0000 (0)\n-4F14 Comment Length        0000 (0)\n-4F16 Disk Start            0000 (0)\n-4F18 Int File Attributes   0000 (0)\n+4F58 CENTRAL HEADER #5     02014B50 (33639248)\n+4F5C Created Zip Spec      14 (20) '2.0'\n+4F5D Created OS            03 (3) 'Unix'\n+4F5E Extract Zip Spec      0A (10) '1.0'\n+4F5F Extract OS            00 (0) 'MS-DOS'\n+4F60 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4F62 Compression Method    0000 (0) 'Stored'\n+4F64 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4F68 CRC                   00000000 (0)\n+4F6C Compressed Size       00000000 (0)\n+4F70 Uncompressed Size     00000000 (0)\n+4F74 Filename Length       0011 (17)\n+4F76 Extra Length          0000 (0)\n+4F78 Comment Length        0000 (0)\n+4F7A Disk Start            0000 (0)\n+4F7C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4F1A Ext File Attributes   41ED0010 (1106051088)\n+4F7E Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4F1E Local Header Offset   000000E6 (230)\n-4F22 Filename              'XXXXXXXXXXXXXXXXX'\n+4F82 Local Header Offset   000000E6 (230)\n+4F86 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F22: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F86: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4F22: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4F86: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4EFA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F5E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-4F33 CENTRAL HEADER #6     02014B50 (33639248)\n-4F37 Created Zip Spec      14 (20) '2.0'\n-4F38 Created OS            03 (3) 'Unix'\n-4F39 Extract Zip Spec      0A (10) '1.0'\n-4F3A Extract OS            00 (0) 'MS-DOS'\n-4F3B General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4F3D Compression Method    0000 (0) 'Stored'\n-4F3F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4F43 CRC                   00000000 (0)\n-4F47 Compressed Size       00000000 (0)\n-4F4B Uncompressed Size     00000000 (0)\n-4F4F Filename Length       001A (26)\n-4F51 Extra Length          0000 (0)\n-4F53 Comment Length        0000 (0)\n-4F55 Disk Start            0000 (0)\n-4F57 Int File Attributes   0000 (0)\n+4F97 CENTRAL HEADER #6     02014B50 (33639248)\n+4F9B Created Zip Spec      14 (20) '2.0'\n+4F9C Created OS            03 (3) 'Unix'\n+4F9D Extract Zip Spec      0A (10) '1.0'\n+4F9E Extract OS            00 (0) 'MS-DOS'\n+4F9F General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4FA1 Compression Method    0000 (0) 'Stored'\n+4FA3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4FA7 CRC                   00000000 (0)\n+4FAB Compressed Size       00000000 (0)\n+4FAF Uncompressed Size     00000000 (0)\n+4FB3 Filename Length       001A (26)\n+4FB5 Extra Length          0000 (0)\n+4FB7 Comment Length        0000 (0)\n+4FB9 Disk Start            0000 (0)\n+4FBB Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4F59 Ext File Attributes   41ED0010 (1106051088)\n+4FBD Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4F5D Local Header Offset   00000115 (277)\n-4F61 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4FC1 Local Header Offset   00000115 (277)\n+4FC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4F61: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4FC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4F61: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4FC5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4F39: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4F9D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-4F7B CENTRAL HEADER #7     02014B50 (33639248)\n-4F7F Created Zip Spec      14 (20) '2.0'\n-4F80 Created OS            03 (3) 'Unix'\n-4F81 Extract Zip Spec      0A (10) '1.0'\n-4F82 Extract OS            00 (0) 'MS-DOS'\n-4F83 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4F85 Compression Method    0000 (0) 'Stored'\n-4F87 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4F8B CRC                   00000000 (0)\n-4F8F Compressed Size       00000000 (0)\n-4F93 Uncompressed Size     00000000 (0)\n-4F97 Filename Length       0021 (33)\n-4F99 Extra Length          0000 (0)\n-4F9B Comment Length        0000 (0)\n-4F9D Disk Start            0000 (0)\n-4F9F Int File Attributes   0000 (0)\n+4FDF CENTRAL HEADER #7     02014B50 (33639248)\n+4FE3 Created Zip Spec      14 (20) '2.0'\n+4FE4 Created OS            03 (3) 'Unix'\n+4FE5 Extract Zip Spec      0A (10) '1.0'\n+4FE6 Extract OS            00 (0) 'MS-DOS'\n+4FE7 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4FE9 Compression Method    0000 (0) 'Stored'\n+4FEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4FEF CRC                   00000000 (0)\n+4FF3 Compressed Size       00000000 (0)\n+4FF7 Uncompressed Size     00000000 (0)\n+4FFB Filename Length       0021 (33)\n+4FFD Extra Length          0000 (0)\n+4FFF Comment Length        0000 (0)\n+5001 Disk Start            0000 (0)\n+5003 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4FA1 Ext File Attributes   41ED0010 (1106051088)\n+5005 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4FA5 Local Header Offset   0000014D (333)\n-4FA9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5009 Local Header Offset   0000014D (333)\n+500D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4FA9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x500D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4FA9: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x500D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4F81: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4FE5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-4FCA CENTRAL HEADER #8     02014B50 (33639248)\n-4FCE Created Zip Spec      14 (20) '2.0'\n-4FCF Created OS            03 (3) 'Unix'\n-4FD0 Extract Zip Spec      0A (10) '1.0'\n-4FD1 Extract OS            00 (0) 'MS-DOS'\n-4FD2 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4FD4 Compression Method    0000 (0) 'Stored'\n-4FD6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4FDA CRC                   00000000 (0)\n-4FDE Compressed Size       00000000 (0)\n-4FE2 Uncompressed Size     00000000 (0)\n-4FE6 Filename Length       000F (15)\n-4FE8 Extra Length          0000 (0)\n-4FEA Comment Length        0000 (0)\n-4FEC Disk Start            0000 (0)\n-4FEE Int File Attributes   0000 (0)\n+502E CENTRAL HEADER #8     02014B50 (33639248)\n+5032 Created Zip Spec      14 (20) '2.0'\n+5033 Created OS            03 (3) 'Unix'\n+5034 Extract Zip Spec      0A (10) '1.0'\n+5035 Extract OS            00 (0) 'MS-DOS'\n+5036 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5038 Compression Method    0000 (0) 'Stored'\n+503A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+503E CRC                   00000000 (0)\n+5042 Compressed Size       00000000 (0)\n+5046 Uncompressed Size     00000000 (0)\n+504A Filename Length       000F (15)\n+504C Extra Length          0000 (0)\n+504E Comment Length        0000 (0)\n+5050 Disk Start            0000 (0)\n+5052 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4FF0 Ext File Attributes   41ED0010 (1106051088)\n+5054 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-4FF4 Local Header Offset   0000018C (396)\n-4FF8 Filename              'XXXXXXXXXXXXXXX'\n+5058 Local Header Offset   0000018C (396)\n+505C Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4FF8: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x505C: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4FF8: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x505C: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4FD0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5034: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-5007 CENTRAL HEADER #9     02014B50 (33639248)\n-500B Created Zip Spec      14 (20) '2.0'\n-500C Created OS            03 (3) 'Unix'\n-500D Extract Zip Spec      0A (10) '1.0'\n-500E Extract OS            00 (0) 'MS-DOS'\n-500F General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5011 Compression Method    0000 (0) 'Stored'\n-5013 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5017 CRC                   00000000 (0)\n-501B Compressed Size       00000000 (0)\n-501F Uncompressed Size     00000000 (0)\n-5023 Filename Length       0018 (24)\n-5025 Extra Length          0000 (0)\n-5027 Comment Length        0000 (0)\n-5029 Disk Start            0000 (0)\n-502B Int File Attributes   0000 (0)\n+506B CENTRAL HEADER #9     02014B50 (33639248)\n+506F Created Zip Spec      14 (20) '2.0'\n+5070 Created OS            03 (3) 'Unix'\n+5071 Extract Zip Spec      0A (10) '1.0'\n+5072 Extract OS            00 (0) 'MS-DOS'\n+5073 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5075 Compression Method    0000 (0) 'Stored'\n+5077 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+507B CRC                   00000000 (0)\n+507F Compressed Size       00000000 (0)\n+5083 Uncompressed Size     00000000 (0)\n+5087 Filename Length       0018 (24)\n+5089 Extra Length          0000 (0)\n+508B Comment Length        0000 (0)\n+508D Disk Start            0000 (0)\n+508F Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-502D Ext File Attributes   41ED0010 (1106051088)\n+5091 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5031 Local Header Offset   000001B9 (441)\n-5035 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+5095 Local Header Offset   000001B9 (441)\n+5099 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5035: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5099: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5035: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x5099: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x500D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5071: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-504D CENTRAL HEADER #10    02014B50 (33639248)\n-5051 Created Zip Spec      14 (20) '2.0'\n-5052 Created OS            03 (3) 'Unix'\n-5053 Extract Zip Spec      0A (10) '1.0'\n-5054 Extract OS            00 (0) 'MS-DOS'\n-5055 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5057 Compression Method    0000 (0) 'Stored'\n-5059 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-505D CRC                   00000000 (0)\n-5061 Compressed Size       00000000 (0)\n-5065 Uncompressed Size     00000000 (0)\n-5069 Filename Length       000F (15)\n-506B Extra Length          0000 (0)\n-506D Comment Length        0000 (0)\n-506F Disk Start            0000 (0)\n-5071 Int File Attributes   0000 (0)\n+50B1 CENTRAL HEADER #10    02014B50 (33639248)\n+50B5 Created Zip Spec      14 (20) '2.0'\n+50B6 Created OS            03 (3) 'Unix'\n+50B7 Extract Zip Spec      0A (10) '1.0'\n+50B8 Extract OS            00 (0) 'MS-DOS'\n+50B9 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+50BB Compression Method    0000 (0) 'Stored'\n+50BD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+50C1 CRC                   00000000 (0)\n+50C5 Compressed Size       00000000 (0)\n+50C9 Uncompressed Size     00000000 (0)\n+50CD Filename Length       000F (15)\n+50CF Extra Length          0000 (0)\n+50D1 Comment Length        0000 (0)\n+50D3 Disk Start            0000 (0)\n+50D5 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5073 Ext File Attributes   41ED0010 (1106051088)\n+50D7 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5077 Local Header Offset   000001EF (495)\n-507B Filename              'XXXXXXXXXXXXXXX'\n+50DB Local Header Offset   000001EF (495)\n+50DF Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x507B: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50DF: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x507B: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x50DF: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5053: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50B7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-508A CENTRAL HEADER #11    02014B50 (33639248)\n-508E Created Zip Spec      14 (20) '2.0'\n-508F Created OS            03 (3) 'Unix'\n-5090 Extract Zip Spec      0A (10) '1.0'\n-5091 Extract OS            00 (0) 'MS-DOS'\n-5092 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-5094 Compression Method    0000 (0) 'Stored'\n-5096 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-509A CRC                   00000000 (0)\n-509E Compressed Size       00000000 (0)\n-50A2 Uncompressed Size     00000000 (0)\n-50A6 Filename Length       0020 (32)\n-50A8 Extra Length          0000 (0)\n-50AA Comment Length        0000 (0)\n-50AC Disk Start            0000 (0)\n-50AE Int File Attributes   0000 (0)\n+50EE CENTRAL HEADER #11    02014B50 (33639248)\n+50F2 Created Zip Spec      14 (20) '2.0'\n+50F3 Created OS            03 (3) 'Unix'\n+50F4 Extract Zip Spec      0A (10) '1.0'\n+50F5 Extract OS            00 (0) 'MS-DOS'\n+50F6 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+50F8 Compression Method    0000 (0) 'Stored'\n+50FA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+50FE CRC                   00000000 (0)\n+5102 Compressed Size       00000000 (0)\n+5106 Uncompressed Size     00000000 (0)\n+510A Filename Length       0020 (32)\n+510C Extra Length          0000 (0)\n+510E Comment Length        0000 (0)\n+5110 Disk Start            0000 (0)\n+5112 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-50B0 Ext File Attributes   41ED0010 (1106051088)\n+5114 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-50B4 Local Header Offset   0000021C (540)\n-50B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5118 Local Header Offset   0000021C (540)\n+511C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x50B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x511C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x50B8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x511C: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x5090: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x50F4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-50D8 CENTRAL HEADER #12    02014B50 (33639248)\n-50DC Created Zip Spec      14 (20) '2.0'\n-50DD Created OS            03 (3) 'Unix'\n-50DE Extract Zip Spec      0A (10) '1.0'\n-50DF Extract OS            00 (0) 'MS-DOS'\n-50E0 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-50E2 Compression Method    0000 (0) 'Stored'\n-50E4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-50E8 CRC                   00000000 (0)\n-50EC Compressed Size       00000000 (0)\n-50F0 Uncompressed Size     00000000 (0)\n-50F4 Filename Length       0036 (54)\n-50F6 Extra Length          0000 (0)\n-50F8 Comment Length        0000 (0)\n-50FA Disk Start            0000 (0)\n-50FC Int File Attributes   0000 (0)\n+513C CENTRAL HEADER #12    02014B50 (33639248)\n+5140 Created Zip Spec      14 (20) '2.0'\n+5141 Created OS            03 (3) 'Unix'\n+5142 Extract Zip Spec      0A (10) '1.0'\n+5143 Extract OS            00 (0) 'MS-DOS'\n+5144 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+5146 Compression Method    0000 (0) 'Stored'\n+5148 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+514C CRC                   00000000 (0)\n+5150 Compressed Size       00000000 (0)\n+5154 Uncompressed Size     00000000 (0)\n+5158 Filename Length       0036 (54)\n+515A Extra Length          0000 (0)\n+515C Comment Length        0000 (0)\n+515E Disk Start            0000 (0)\n+5160 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-50FE Ext File Attributes   41ED0010 (1106051088)\n+5162 Ext File Attributes   41ED0010 (1106051088)\n      [Bit 4]               Directory\n      [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n      [Bits 28-31]          04 (4) 'Directory'\n-5102 Local Header Offset   0000025A (602)\n-5106 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5166 Local Header Offset   0000025A (602)\n+516A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5106: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x516A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x5106: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x516A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x50DE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5142: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-513C CENTRAL HEADER #13    02014B50 (33639248)\n-5140 Created Zip Spec      14 (20) '2.0'\n-5141 Created OS            03 (3) 'Unix'\n-5142 Extract Zip Spec      14 (20) '2.0'\n-5143 Extract OS            00 (0) 'MS-DOS'\n-5144 General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n-     [Bit 11]              1 'Language Encoding'\n-5146 Compression Method    0008 (8) 'Deflated'\n-5148 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-514C CRC                   CDF3DBFF (3455310847)\n-5150 Compressed Size       000003E7 (999)\n-5154 Uncompressed Size     000012B8 (4792)\n-5158 Filename Length       0015 (21)\n-515A Extra Length          0000 (0)\n-515C Comment Length        0000 (0)\n-515E Disk Start            0000 (0)\n-5160 Int File Attributes   0000 (0)\n+51A0 CENTRAL HEADER #13    02014B50 (33639248)\n+51A4 Created Zip Spec      14 (20) '2.0'\n+51A5 Created OS            03 (3) 'Unix'\n+51A6 Extract Zip Spec      14 (20) '2.0'\n+51A7 Extract OS            00 (0) 'MS-DOS'\n+51A8 General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+51AA Compression Method    0008 (8) 'Deflated'\n+51AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+51B0 CRC                   CDF3DBFF (3455310847)\n+51B4 Compressed Size       000003E7 (999)\n+51B8 Uncompressed Size     000012B8 (4792)\n+51BC Filename Length       0015 (21)\n+51BE Extra Length          0000 (0)\n+51C0 Comment Length        0000 (0)\n+51C2 Disk Start            0000 (0)\n+51C4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5162 Ext File Attributes   81A40000 (2175008768)\n+51C6 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5166 Local Header Offset   000002AE (686)\n-516A Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+51CA Local Header Offset   000002AE (686)\n+51CE Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x516A: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x51CE: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-517F CENTRAL HEADER #14    02014B50 (33639248)\n-5183 Created Zip Spec      14 (20) '2.0'\n-5184 Created OS            03 (3) 'Unix'\n-5185 Extract Zip Spec      14 (20) '2.0'\n-5186 Extract OS            00 (0) 'MS-DOS'\n-5187 General Purpose Flag  0800 (2048)\n+51E3 CENTRAL HEADER #14    02014B50 (33639248)\n+51E7 Created Zip Spec      14 (20) '2.0'\n+51E8 Created OS            03 (3) 'Unix'\n+51E9 Extract Zip Spec      14 (20) '2.0'\n+51EA Extract OS            00 (0) 'MS-DOS'\n+51EB General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5189 Compression Method    0008 (8) 'Deflated'\n-518B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-518F CRC                   86E2B4B4 (2263004340)\n-5193 Compressed Size       00000F6D (3949)\n-5197 Uncompressed Size     00002C5E (11358)\n-519B Filename Length       0010 (16)\n-519D Extra Length          0000 (0)\n-519F Comment Length        0000 (0)\n-51A1 Disk Start            0000 (0)\n-51A3 Int File Attributes   0000 (0)\n+51ED Compression Method    0008 (8) 'Deflated'\n+51EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+51F3 CRC                   86E2B4B4 (2263004340)\n+51F7 Compressed Size       00000F6D (3949)\n+51FB Uncompressed Size     00002C5E (11358)\n+51FF Filename Length       0010 (16)\n+5201 Extra Length          0000 (0)\n+5203 Comment Length        0000 (0)\n+5205 Disk Start            0000 (0)\n+5207 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-51A5 Ext File Attributes   81A40000 (2175008768)\n+5209 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-51A9 Local Header Offset   000006C8 (1736)\n-51AD Filename              'XXXXXXXXXXXXXXXX'\n+520D Local Header Offset   000006C8 (1736)\n+5211 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51AD: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5211: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-51BD CENTRAL HEADER #15    02014B50 (33639248)\n-51C1 Created Zip Spec      14 (20) '2.0'\n-51C2 Created OS            03 (3) 'Unix'\n-51C3 Extract Zip Spec      14 (20) '2.0'\n-51C4 Extract OS            00 (0) 'MS-DOS'\n-51C5 General Purpose Flag  0800 (2048)\n+5221 CENTRAL HEADER #15    02014B50 (33639248)\n+5225 Created Zip Spec      14 (20) '2.0'\n+5226 Created OS            03 (3) 'Unix'\n+5227 Extract Zip Spec      14 (20) '2.0'\n+5228 Extract OS            00 (0) 'MS-DOS'\n+5229 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-51C7 Compression Method    0008 (8) 'Deflated'\n-51C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-51CD CRC                   E5A5E730 (3852855088)\n-51D1 Compressed Size       00000082 (130)\n-51D5 Uncompressed Size     000000B2 (178)\n-51D9 Filename Length       000F (15)\n-51DB Extra Length          0000 (0)\n-51DD Comment Length        0000 (0)\n-51DF Disk Start            0000 (0)\n-51E1 Int File Attributes   0000 (0)\n+522B Compression Method    0008 (8) 'Deflated'\n+522D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5231 CRC                   E5A5E730 (3852855088)\n+5235 Compressed Size       00000082 (130)\n+5239 Uncompressed Size     000000B2 (178)\n+523D Filename Length       000F (15)\n+523F Extra Length          0000 (0)\n+5241 Comment Length        0000 (0)\n+5243 Disk Start            0000 (0)\n+5245 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-51E3 Ext File Attributes   81A40000 (2175008768)\n+5247 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-51E7 Local Header Offset   00001663 (5731)\n-51EB Filename              'XXXXXXXXXXXXXXX'\n+524B Local Header Offset   00001663 (5731)\n+524F Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x51EB: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x524F: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-51FA CENTRAL HEADER #16    02014B50 (33639248)\n-51FE Created Zip Spec      14 (20) '2.0'\n-51FF Created OS            03 (3) 'Unix'\n-5200 Extract Zip Spec      14 (20) '2.0'\n-5201 Extract OS            00 (0) 'MS-DOS'\n-5202 General Purpose Flag  0800 (2048)\n+525E CENTRAL HEADER #16    02014B50 (33639248)\n+5262 Created Zip Spec      14 (20) '2.0'\n+5263 Created OS            03 (3) 'Unix'\n+5264 Extract Zip Spec      14 (20) '2.0'\n+5265 Extract OS            00 (0) 'MS-DOS'\n+5266 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5204 Compression Method    0008 (8) 'Deflated'\n-5206 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-520A CRC                   DD92E439 (3717391417)\n-520E Compressed Size       00000315 (789)\n-5212 Uncompressed Size     00000641 (1601)\n-5216 Filename Length       003C (60)\n-5218 Extra Length          0000 (0)\n-521A Comment Length        0000 (0)\n-521C Disk Start            0000 (0)\n-521E Int File Attributes   0000 (0)\n+5268 Compression Method    0008 (8) 'Deflated'\n+526A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+526E CRC                   5B9C99AA (1536989610)\n+5272 Compressed Size       00000321 (801)\n+5276 Uncompressed Size     00000668 (1640)\n+527A Filename Length       003C (60)\n+527C Extra Length          0000 (0)\n+527E Comment Length        0000 (0)\n+5280 Disk Start            0000 (0)\n+5282 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5220 Ext File Attributes   81A40000 (2175008768)\n+5284 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5224 Local Header Offset   00001712 (5906)\n-5228 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5288 Local Header Offset   00001712 (5906)\n+528C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5228: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x528C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5264 CENTRAL HEADER #17    02014B50 (33639248)\n-5268 Created Zip Spec      14 (20) '2.0'\n-5269 Created OS            03 (3) 'Unix'\n-526A Extract Zip Spec      14 (20) '2.0'\n-526B Extract OS            00 (0) 'MS-DOS'\n-526C General Purpose Flag  0800 (2048)\n+52C8 CENTRAL HEADER #17    02014B50 (33639248)\n+52CC Created Zip Spec      14 (20) '2.0'\n+52CD Created OS            03 (3) 'Unix'\n+52CE Extract Zip Spec      14 (20) '2.0'\n+52CF Extract OS            00 (0) 'MS-DOS'\n+52D0 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-526E Compression Method    0008 (8) 'Deflated'\n-5270 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5274 CRC                   1FAE29F0 (531507696)\n-5278 Compressed Size       000003E5 (997)\n-527C Uncompressed Size     000009D3 (2515)\n-5280 Filename Length       0035 (53)\n-5282 Extra Length          0000 (0)\n-5284 Comment Length        0000 (0)\n-5286 Disk Start            0000 (0)\n-5288 Int File Attributes   0000 (0)\n+52D2 Compression Method    0008 (8) 'Deflated'\n+52D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+52D8 CRC                   050B43B2 (84624306)\n+52DC Compressed Size       000003EF (1007)\n+52E0 Uncompressed Size     00000A2A (2602)\n+52E4 Filename Length       0035 (53)\n+52E6 Extra Length          0000 (0)\n+52E8 Comment Length        0000 (0)\n+52EA Disk Start            0000 (0)\n+52EC Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-528A Ext File Attributes   81A40000 (2175008768)\n+52EE Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-528E Local Header Offset   00001A81 (6785)\n-5292 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+52F2 Local Header Offset   00001A8D (6797)\n+52F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5292: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x52F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-52C7 CENTRAL HEADER #18    02014B50 (33639248)\n-52CB Created Zip Spec      14 (20) '2.0'\n-52CC Created OS            03 (3) 'Unix'\n-52CD Extract Zip Spec      14 (20) '2.0'\n-52CE Extract OS            00 (0) 'MS-DOS'\n-52CF General Purpose Flag  0800 (2048)\n+532B CENTRAL HEADER #18    02014B50 (33639248)\n+532F Created Zip Spec      14 (20) '2.0'\n+5330 Created OS            03 (3) 'Unix'\n+5331 Extract Zip Spec      14 (20) '2.0'\n+5332 Extract OS            00 (0) 'MS-DOS'\n+5333 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-52D1 Compression Method    0008 (8) 'Deflated'\n-52D3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-52D7 CRC                   CF695E4A (3479789130)\n-52DB Compressed Size       00000D24 (3364)\n-52DF Uncompressed Size     00003883 (14467)\n-52E3 Filename Length       0034 (52)\n-52E5 Extra Length          0000 (0)\n-52E7 Comment Length        0000 (0)\n-52E9 Disk Start            0000 (0)\n-52EB Int File Attributes   0000 (0)\n+5335 Compression Method    0008 (8) 'Deflated'\n+5337 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+533B CRC                   C548D865 (3309885541)\n+533F Compressed Size       00000D3A (3386)\n+5343 Uncompressed Size     000039FF (14847)\n+5347 Filename Length       0034 (52)\n+5349 Extra Length          0000 (0)\n+534B Comment Length        0000 (0)\n+534D Disk Start            0000 (0)\n+534F Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-52ED Ext File Attributes   81A40000 (2175008768)\n+5351 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-52F1 Local Header Offset   00001EB9 (7865)\n-52F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5355 Local Header Offset   00001ECF (7887)\n+5359 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x52F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5359: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5329 CENTRAL HEADER #19    02014B50 (33639248)\n-532D Created Zip Spec      14 (20) '2.0'\n-532E Created OS            03 (3) 'Unix'\n-532F Extract Zip Spec      14 (20) '2.0'\n-5330 Extract OS            00 (0) 'MS-DOS'\n-5331 General Purpose Flag  0800 (2048)\n+538D CENTRAL HEADER #19    02014B50 (33639248)\n+5391 Created Zip Spec      14 (20) '2.0'\n+5392 Created OS            03 (3) 'Unix'\n+5393 Extract Zip Spec      14 (20) '2.0'\n+5394 Extract OS            00 (0) 'MS-DOS'\n+5395 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5333 Compression Method    0008 (8) 'Deflated'\n-5335 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5339 CRC                   EE6324FC (3999474940)\n-533D Compressed Size       00000273 (627)\n-5341 Uncompressed Size     000004D1 (1233)\n-5345 Filename Length       003B (59)\n-5347 Extra Length          0000 (0)\n-5349 Comment Length        0000 (0)\n-534B Disk Start            0000 (0)\n-534D Int File Attributes   0000 (0)\n+5397 Compression Method    0008 (8) 'Deflated'\n+5399 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+539D CRC                   F93C1E65 (4181466725)\n+53A1 Compressed Size       0000027B (635)\n+53A5 Uncompressed Size     000004F1 (1265)\n+53A9 Filename Length       003B (59)\n+53AB Extra Length          0000 (0)\n+53AD Comment Length        0000 (0)\n+53AF Disk Start            0000 (0)\n+53B1 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-534F Ext File Attributes   81A40000 (2175008768)\n+53B3 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5353 Local Header Offset   00002C2F (11311)\n-5357 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+53B7 Local Header Offset   00002C5B (11355)\n+53BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5357: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x53BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5392 CENTRAL HEADER #20    02014B50 (33639248)\n-5396 Created Zip Spec      14 (20) '2.0'\n-5397 Created OS            03 (3) 'Unix'\n-5398 Extract Zip Spec      14 (20) '2.0'\n-5399 Extract OS            00 (0) 'MS-DOS'\n-539A General Purpose Flag  0800 (2048)\n+53F6 CENTRAL HEADER #20    02014B50 (33639248)\n+53FA Created Zip Spec      14 (20) '2.0'\n+53FB Created OS            03 (3) 'Unix'\n+53FC Extract Zip Spec      14 (20) '2.0'\n+53FD Extract OS            00 (0) 'MS-DOS'\n+53FE General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-539C Compression Method    0008 (8) 'Deflated'\n-539E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-53A2 CRC                   8A186986 (2316855686)\n-53A6 Compressed Size       0000105B (4187)\n-53AA Uncompressed Size     0000477D (18301)\n-53AE Filename Length       003C (60)\n-53B0 Extra Length          0000 (0)\n-53B2 Comment Length        0000 (0)\n-53B4 Disk Start            0000 (0)\n-53B6 Int File Attributes   0000 (0)\n+5400 Compression Method    0008 (8) 'Deflated'\n+5402 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5406 CRC                   1758261F (391652895)\n+540A Compressed Size       00001076 (4214)\n+540E Uncompressed Size     0000495E (18782)\n+5412 Filename Length       003C (60)\n+5414 Extra Length          0000 (0)\n+5416 Comment Length        0000 (0)\n+5418 Disk Start            0000 (0)\n+541A Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-53B8 Ext File Attributes   81A40000 (2175008768)\n+541C Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-53BC Local Header Offset   00002EFB (12027)\n-53C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5420 Local Header Offset   00002F2F (12079)\n+5424 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x53C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5424: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-53FC CENTRAL HEADER #21    02014B50 (33639248)\n-5400 Created Zip Spec      14 (20) '2.0'\n-5401 Created OS            03 (3) 'Unix'\n-5402 Extract Zip Spec      14 (20) '2.0'\n-5403 Extract OS            00 (0) 'MS-DOS'\n-5404 General Purpose Flag  0800 (2048)\n+5460 CENTRAL HEADER #21    02014B50 (33639248)\n+5464 Created Zip Spec      14 (20) '2.0'\n+5465 Created OS            03 (3) 'Unix'\n+5466 Extract Zip Spec      14 (20) '2.0'\n+5467 Extract OS            00 (0) 'MS-DOS'\n+5468 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5406 Compression Method    0008 (8) 'Deflated'\n-5408 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-540C CRC                   35541C2F (894704687)\n-5410 Compressed Size       00000263 (611)\n-5414 Uncompressed Size     000004D1 (1233)\n-5418 Filename Length       0043 (67)\n-541A Extra Length          0000 (0)\n-541C Comment Length        0000 (0)\n-541E Disk Start            0000 (0)\n-5420 Int File Attributes   0000 (0)\n+546A Compression Method    0008 (8) 'Deflated'\n+546C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5470 CRC                   09B44E50 (162811472)\n+5474 Compressed Size       0000026C (620)\n+5478 Uncompressed Size     000004EF (1263)\n+547C Filename Length       0043 (67)\n+547E Extra Length          0000 (0)\n+5480 Comment Length        0000 (0)\n+5482 Disk Start            0000 (0)\n+5484 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5422 Ext File Attributes   81A40000 (2175008768)\n+5486 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5426 Local Header Offset   00003FB0 (16304)\n-542A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+548A Local Header Offset   00003FFF (16383)\n+548E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x542A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x548E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-546D CENTRAL HEADER #22    02014B50 (33639248)\n-5471 Created Zip Spec      14 (20) '2.0'\n-5472 Created OS            03 (3) 'Unix'\n-5473 Extract Zip Spec      14 (20) '2.0'\n-5474 Extract OS            00 (0) 'MS-DOS'\n-5475 General Purpose Flag  0800 (2048)\n+54D1 CENTRAL HEADER #22    02014B50 (33639248)\n+54D5 Created Zip Spec      14 (20) '2.0'\n+54D6 Created OS            03 (3) 'Unix'\n+54D7 Extract Zip Spec      14 (20) '2.0'\n+54D8 Extract OS            00 (0) 'MS-DOS'\n+54D9 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5477 Compression Method    0008 (8) 'Deflated'\n-5479 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-547D CRC                   35541C2F (894704687)\n-5481 Compressed Size       00000263 (611)\n-5485 Uncompressed Size     000004D1 (1233)\n-5489 Filename Length       0048 (72)\n-548B Extra Length          0000 (0)\n-548D Comment Length        0000 (0)\n-548F Disk Start            0000 (0)\n-5491 Int File Attributes   0000 (0)\n+54DB Compression Method    0008 (8) 'Deflated'\n+54DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+54E1 CRC                   09B44E50 (162811472)\n+54E5 Compressed Size       0000026C (620)\n+54E9 Uncompressed Size     000004EF (1263)\n+54ED Filename Length       0048 (72)\n+54EF Extra Length          0000 (0)\n+54F1 Comment Length        0000 (0)\n+54F3 Disk Start            0000 (0)\n+54F5 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5493 Ext File Attributes   81A40000 (2175008768)\n+54F7 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5497 Local Header Offset   00004274 (17012)\n-549B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+54FB Local Header Offset   000042CC (17100)\n+54FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x549B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x54FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-54E3 CENTRAL HEADER #23    02014B50 (33639248)\n-54E7 Created Zip Spec      14 (20) '2.0'\n-54E8 Created OS            03 (3) 'Unix'\n-54E9 Extract Zip Spec      14 (20) '2.0'\n-54EA Extract OS            00 (0) 'MS-DOS'\n-54EB General Purpose Flag  0800 (2048)\n+5547 CENTRAL HEADER #23    02014B50 (33639248)\n+554B Created Zip Spec      14 (20) '2.0'\n+554C Created OS            03 (3) 'Unix'\n+554D Extract Zip Spec      14 (20) '2.0'\n+554E Extract OS            00 (0) 'MS-DOS'\n+554F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-54ED Compression Method    0008 (8) 'Deflated'\n-54EF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-54F3 CRC                   35541C2F (894704687)\n-54F7 Compressed Size       00000263 (611)\n-54FB Uncompressed Size     000004D1 (1233)\n-54FF Filename Length       0050 (80)\n-5501 Extra Length          0000 (0)\n-5503 Comment Length        0000 (0)\n-5505 Disk Start            0000 (0)\n-5507 Int File Attributes   0000 (0)\n+5551 Compression Method    0008 (8) 'Deflated'\n+5553 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5557 CRC                   09B44E50 (162811472)\n+555B Compressed Size       0000026C (620)\n+555F Uncompressed Size     000004EF (1263)\n+5563 Filename Length       0050 (80)\n+5565 Extra Length          0000 (0)\n+5567 Comment Length        0000 (0)\n+5569 Disk Start            0000 (0)\n+556B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5509 Ext File Attributes   81A40000 (2175008768)\n+556D Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-550D Local Header Offset   0000453D (17725)\n-5511 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5571 Local Header Offset   0000459E (17822)\n+5575 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5511: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5575: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-5561 CENTRAL HEADER #24    02014B50 (33639248)\n-5565 Created Zip Spec      14 (20) '2.0'\n-5566 Created OS            03 (3) 'Unix'\n-5567 Extract Zip Spec      14 (20) '2.0'\n-5568 Extract OS            00 (0) 'MS-DOS'\n-5569 General Purpose Flag  0800 (2048)\n+55C5 CENTRAL HEADER #24    02014B50 (33639248)\n+55C9 Created Zip Spec      14 (20) '2.0'\n+55CA Created OS            03 (3) 'Unix'\n+55CB Extract Zip Spec      14 (20) '2.0'\n+55CC Extract OS            00 (0) 'MS-DOS'\n+55CD General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-556B Compression Method    0008 (8) 'Deflated'\n-556D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-5571 CRC                   8BCE1404 (2345538564)\n-5575 Compressed Size       00000035 (53)\n-5579 Uncompressed Size     0000003F (63)\n-557D Filename Length       0041 (65)\n-557F Extra Length          0000 (0)\n-5581 Comment Length        0000 (0)\n-5583 Disk Start            0000 (0)\n-5585 Int File Attributes   0000 (0)\n+55CF Compression Method    0008 (8) 'Deflated'\n+55D1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+55D5 CRC                   8BCE1404 (2345538564)\n+55D9 Compressed Size       00000035 (53)\n+55DD Uncompressed Size     0000003F (63)\n+55E1 Filename Length       0041 (65)\n+55E3 Extra Length          0000 (0)\n+55E5 Comment Length        0000 (0)\n+55E7 Disk Start            0000 (0)\n+55E9 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5587 Ext File Attributes   81A40000 (2175008768)\n+55EB Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-558B Local Header Offset   0000480E (18446)\n-558F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+55EF Local Header Offset   00004878 (18552)\n+55F3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x558F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x55F3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-55D0 CENTRAL HEADER #25    02014B50 (33639248)\n-55D4 Created Zip Spec      14 (20) '2.0'\n-55D5 Created OS            03 (3) 'Unix'\n-55D6 Extract Zip Spec      14 (20) '2.0'\n-55D7 Extract OS            00 (0) 'MS-DOS'\n-55D8 General Purpose Flag  0800 (2048)\n+5634 CENTRAL HEADER #25    02014B50 (33639248)\n+5638 Created Zip Spec      14 (20) '2.0'\n+5639 Created OS            03 (3) 'Unix'\n+563A Extract Zip Spec      14 (20) '2.0'\n+563B Extract OS            00 (0) 'MS-DOS'\n+563C General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-55DA Compression Method    0008 (8) 'Deflated'\n-55DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-55E0 CRC                   FA6D0539 (4201448761)\n-55E4 Compressed Size       00000040 (64)\n-55E8 Uncompressed Size     00000045 (69)\n-55EC Filename Length       0050 (80)\n-55EE Extra Length          0000 (0)\n-55F0 Comment Length        0000 (0)\n-55F2 Disk Start            0000 (0)\n-55F4 Int File Attributes   0000 (0)\n+563E Compression Method    0008 (8) 'Deflated'\n+5640 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+5644 CRC                   FA6D0539 (4201448761)\n+5648 Compressed Size       00000040 (64)\n+564C Uncompressed Size     00000045 (69)\n+5650 Filename Length       0050 (80)\n+5652 Extra Length          0000 (0)\n+5654 Comment Length        0000 (0)\n+5656 Disk Start            0000 (0)\n+5658 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-55F6 Ext File Attributes   81A40000 (2175008768)\n+565A Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-55FA Local Header Offset   000048A2 (18594)\n-55FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+565E Local Header Offset   0000490C (18700)\n+5662 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x55FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5662: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-564E CENTRAL HEADER #26    02014B50 (33639248)\n-5652 Created Zip Spec      14 (20) '2.0'\n-5653 Created OS            03 (3) 'Unix'\n-5654 Extract Zip Spec      14 (20) '2.0'\n-5655 Extract OS            00 (0) 'MS-DOS'\n-5656 General Purpose Flag  0800 (2048)\n+56B2 CENTRAL HEADER #26    02014B50 (33639248)\n+56B6 Created Zip Spec      14 (20) '2.0'\n+56B7 Created OS            03 (3) 'Unix'\n+56B8 Extract Zip Spec      14 (20) '2.0'\n+56B9 Extract OS            00 (0) 'MS-DOS'\n+56BA General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-5658 Compression Method    0008 (8) 'Deflated'\n-565A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-565E CRC                   178839D9 (394803673)\n-5662 Compressed Size       000003B9 (953)\n-5666 Uncompressed Size     00000992 (2450)\n-566A Filename Length       003D (61)\n-566C Extra Length          0000 (0)\n-566E Comment Length        0000 (0)\n-5670 Disk Start            0000 (0)\n-5672 Int File Attributes   0000 (0)\n+56BC Compression Method    0008 (8) 'Deflated'\n+56BE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+56C2 CRC                   136E4489 (325993609)\n+56C6 Compressed Size       000003B3 (947)\n+56CA Uncompressed Size     00000951 (2385)\n+56CE Filename Length       003D (61)\n+56D0 Extra Length          0000 (0)\n+56D2 Comment Length        0000 (0)\n+56D4 Disk Start            0000 (0)\n+56D6 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-5674 Ext File Attributes   81A40000 (2175008768)\n+56D8 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-5678 Local Header Offset   00004950 (18768)\n-567C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+56DC Local Header Offset   000049BA (18874)\n+56E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x567C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x56E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-56B9 CENTRAL HEADER #27    02014B50 (33639248)\n-56BD Created Zip Spec      14 (20) '2.0'\n-56BE Created OS            03 (3) 'Unix'\n-56BF Extract Zip Spec      14 (20) '2.0'\n-56C0 Extract OS            00 (0) 'MS-DOS'\n-56C1 General Purpose Flag  0800 (2048)\n+571D CENTRAL HEADER #27    02014B50 (33639248)\n+5721 Created Zip Spec      14 (20) '2.0'\n+5722 Created OS            03 (3) 'Unix'\n+5723 Extract Zip Spec      14 (20) '2.0'\n+5724 Extract OS            00 (0) 'MS-DOS'\n+5725 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-56C3 Compression Method    0008 (8) 'Deflated'\n-56C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-56C9 CRC                   153432AD (355742381)\n-56CD Compressed Size       0000004A (74)\n-56D1 Uncompressed Size     0000004C (76)\n-56D5 Filename Length       0044 (68)\n-56D7 Extra Length          0000 (0)\n-56D9 Comment Length        0000 (0)\n-56DB Disk Start            0000 (0)\n-56DD Int File Attributes   0000 (0)\n+5727 Compression Method    0008 (8) 'Deflated'\n+5729 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+572D CRC                   153432AD (355742381)\n+5731 Compressed Size       0000004A (74)\n+5735 Uncompressed Size     0000004C (76)\n+5739 Filename Length       0044 (68)\n+573B Extra Length          0000 (0)\n+573D Comment Length        0000 (0)\n+573F Disk Start            0000 (0)\n+5741 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-56DF Ext File Attributes   81A40000 (2175008768)\n+5743 Ext File Attributes   81A40000 (2175008768)\n      [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n      [Bits 28-31]          08 (8) 'Regular File'\n-56E3 Local Header Offset   00004D64 (19812)\n-56E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+5747 Local Header Offset   00004DC8 (19912)\n+574B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x56E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x574B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-572B END CENTRAL HEADER    06054B50 (101010256)\n-572F Number of this disk   0000 (0)\n-5731 Central Dir Disk no   0000 (0)\n-5733 Entries in this disk  001B (27)\n-5735 Total Entries         001B (27)\n-5737 Size of Central Dir   0000091B (2331)\n-573B Offset to Central Dir 00004E10 (19984)\n-573F Comment Length        0000 (0)\n+578F END CENTRAL HEADER    06054B50 (101010256)\n+5793 Number of this disk   0000 (0)\n+5795 Central Dir Disk no   0000 (0)\n+5797 Entries in this disk  001B (27)\n+5799 Total Entries         001B (27)\n+579B Size of Central Dir   0000091B (2331)\n+579F Offset to Central Dir 00004E74 (20084)\n+57A3 Comment Length        0000 (0)\n #\n # Error Count: 11\n # Warning Count: 65\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/consul/AbstractConsulRegistry.java", "source2": "org/apache/dubbo/registry/consul/AbstractConsulRegistry.java", "comments": ["Ordering 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": ["Ordering 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": ["Ordering 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": ["Ordering 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": ["Ordering 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": ["Ordering 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": ["Ordering 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": ["Ordering 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": "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"}]}
