{"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: 16800 bytes, number of entries: 22\n+Zip file size: 16831 bytes, number of entries: 22\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/etcd/\n@@ -10,15 +10,15 @@\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-etcd3/\n -rw-r--r--  2.0 unx    11590 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      177 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx    15864 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdRegistry.java\n--rw-r--r--  2.0 unx     1409 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdRegistryFactory.java\n--rw-r--r--  2.0 unx     8180 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java\n+-rw-r--r--  2.0 unx    16219 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdRegistry.java\n+-rw-r--r--  2.0 unx     1445 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdRegistryFactory.java\n+-rw-r--r--  2.0 unx     8386 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java\n -rw-r--r--  2.0 unx       56 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n--rw-r--r--  2.0 unx       58 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n--rw-r--r--  2.0 unx     2300 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-etcd3/pom.xml\n+-rw-r--r--  2.0 unx       59 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n+-rw-r--r--  2.0 unx     2245 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-etcd3/pom.xml\n -rw-r--r--  2.0 unx       75 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-etcd3/pom.properties\n-22 files, 51131 bytes uncompressed, 13640 bytes compressed:  73.3%\n+22 files, 51674 bytes uncompressed, 13671 bytes compressed:  73.5%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -281,845 +281,845 @@\n 1B64 Extract Zip Spec      14 (20) '2.0'\n 1B65 Extract OS            00 (0) 'MS-DOS'\n 1B66 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 1B68 Compression Method    0008 (8) 'Deflated'\n 1B6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B6E CRC                   E5134667 (3843245671)\n-1B72 Compressed Size       00000D7E (3454)\n-1B76 Uncompressed Size     00003DF8 (15864)\n+1B6E CRC                   775C02B8 (2002518712)\n+1B72 Compressed Size       00000D8F (3471)\n+1B76 Uncompressed Size     00003F5B (16219)\n 1B7A Filename Length       0030 (48)\n 1B7C Extra Length          0000 (0)\n 1B7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x1B7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 1BAE PAYLOAD\n \n-292C LOCAL HEADER #17      04034B50 (67324752)\n-2930 Extract Zip Spec      14 (20) '2.0'\n-2931 Extract OS            00 (0) 'MS-DOS'\n-2932 General Purpose Flag  0800 (2048)\n+293D LOCAL HEADER #17      04034B50 (67324752)\n+2941 Extract Zip Spec      14 (20) '2.0'\n+2942 Extract OS            00 (0) 'MS-DOS'\n+2943 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-2934 Compression Method    0008 (8) 'Deflated'\n-2936 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-293A CRC                   EAAFA7AC (3937380268)\n-293E Compressed Size       00000291 (657)\n-2942 Uncompressed Size     00000581 (1409)\n-2946 Filename Length       0037 (55)\n-2948 Extra Length          0000 (0)\n-294A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2945 Compression Method    0008 (8) 'Deflated'\n+2947 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+294B CRC                   C7AB4B17 (3349891863)\n+294F Compressed Size       0000029A (666)\n+2953 Uncompressed Size     000005A5 (1445)\n+2957 Filename Length       0037 (55)\n+2959 Extra Length          0000 (0)\n+295B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x294A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x295B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2981 PAYLOAD\n+2992 PAYLOAD\n \n-2C12 LOCAL HEADER #18      04034B50 (67324752)\n-2C16 Extract Zip Spec      14 (20) '2.0'\n-2C17 Extract OS            00 (0) 'MS-DOS'\n-2C18 General Purpose Flag  0800 (2048)\n+2C2C LOCAL HEADER #18      04034B50 (67324752)\n+2C30 Extract Zip Spec      14 (20) '2.0'\n+2C31 Extract OS            00 (0) 'MS-DOS'\n+2C32 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-2C1A Compression Method    0008 (8) 'Deflated'\n-2C1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2C20 CRC                   D94FAF9D (3645878173)\n-2C24 Compressed Size       000008BF (2239)\n-2C28 Uncompressed Size     00001FF4 (8180)\n-2C2C Filename Length       0038 (56)\n-2C2E Extra Length          0000 (0)\n-2C30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2C34 Compression Method    0008 (8) 'Deflated'\n+2C36 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2C3A CRC                   935B5779 (2472236921)\n+2C3E Compressed Size       000008C9 (2249)\n+2C42 Uncompressed Size     000020C2 (8386)\n+2C46 Filename Length       0038 (56)\n+2C48 Extra Length          0000 (0)\n+2C4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2C4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2C68 PAYLOAD\n+2C82 PAYLOAD\n \n-3527 LOCAL HEADER #19      04034B50 (67324752)\n-352B Extract Zip Spec      14 (20) '2.0'\n-352C Extract OS            00 (0) 'MS-DOS'\n-352D General Purpose Flag  0800 (2048)\n+354B LOCAL HEADER #19      04034B50 (67324752)\n+354F Extract Zip Spec      14 (20) '2.0'\n+3550 Extract OS            00 (0) 'MS-DOS'\n+3551 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-352F Compression Method    0008 (8) 'Deflated'\n-3531 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3535 CRC                   8176D79D (2172049309)\n-3539 Compressed Size       00000032 (50)\n-353D Uncompressed Size     00000038 (56)\n-3541 Filename Length       0041 (65)\n-3543 Extra Length          0000 (0)\n-3545 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3553 Compression Method    0008 (8) 'Deflated'\n+3555 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3559 CRC                   8176D79D (2172049309)\n+355D Compressed Size       00000032 (50)\n+3561 Uncompressed Size     00000038 (56)\n+3565 Filename Length       0041 (65)\n+3567 Extra Length          0000 (0)\n+3569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3545: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3586 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+35AA PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-35B8 LOCAL HEADER #20      04034B50 (67324752)\n-35BC Extract Zip Spec      14 (20) '2.0'\n-35BD Extract OS            00 (0) 'MS-DOS'\n-35BE General Purpose Flag  0800 (2048)\n+35DC LOCAL HEADER #20      04034B50 (67324752)\n+35E0 Extract Zip Spec      14 (20) '2.0'\n+35E1 Extract OS            00 (0) 'MS-DOS'\n+35E2 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-35C0 Compression Method    0008 (8) 'Deflated'\n-35C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-35C6 CRC                   09788912 (158894354)\n-35CA Compressed Size       00000039 (57)\n-35CE Uncompressed Size     0000003A (58)\n-35D2 Filename Length       0049 (73)\n-35D4 Extra Length          0000 (0)\n-35D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+35E4 Compression Method    0008 (8) 'Deflated'\n+35E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+35EA CRC                   8E269995 (2384894357)\n+35EE Compressed Size       0000003A (58)\n+35F2 Uncompressed Size     0000003B (59)\n+35F6 Filename Length       0049 (73)\n+35F8 Extra Length          0000 (0)\n+35FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x35D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x35FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-361F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3643 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3658 LOCAL HEADER #21      04034B50 (67324752)\n-365C Extract Zip Spec      14 (20) '2.0'\n-365D Extract OS            00 (0) 'MS-DOS'\n-365E General Purpose Flag  0800 (2048)\n+367D LOCAL HEADER #21      04034B50 (67324752)\n+3681 Extract Zip Spec      14 (20) '2.0'\n+3682 Extract OS            00 (0) 'MS-DOS'\n+3683 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3660 Compression Method    0008 (8) 'Deflated'\n-3662 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3666 CRC                   8F421884 (2403473540)\n-366A Compressed Size       0000035D (861)\n-366E Uncompressed Size     000008FC (2300)\n-3672 Filename Length       003C (60)\n-3674 Extra Length          0000 (0)\n-3676 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3685 Compression Method    0008 (8) 'Deflated'\n+3687 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+368B CRC                   69F6084D (1777731661)\n+368F Compressed Size       00000357 (855)\n+3693 Uncompressed Size     000008C5 (2245)\n+3697 Filename Length       003C (60)\n+3699 Extra Length          0000 (0)\n+369B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3676: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x369B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-36B2 PAYLOAD\n+36D7 PAYLOAD\n \n-3A0F LOCAL HEADER #22      04034B50 (67324752)\n-3A13 Extract Zip Spec      14 (20) '2.0'\n-3A14 Extract OS            00 (0) 'MS-DOS'\n-3A15 General Purpose Flag  0800 (2048)\n+3A2E LOCAL HEADER #22      04034B50 (67324752)\n+3A32 Extract Zip Spec      14 (20) '2.0'\n+3A33 Extract OS            00 (0) 'MS-DOS'\n+3A34 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3A17 Compression Method    0008 (8) 'Deflated'\n-3A19 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A1D CRC                   D8F9DD34 (3640253748)\n-3A21 Compressed Size       00000049 (73)\n-3A25 Uncompressed Size     0000004B (75)\n-3A29 Filename Length       0043 (67)\n-3A2B Extra Length          0000 (0)\n-3A2D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3A36 Compression Method    0008 (8) 'Deflated'\n+3A38 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A3C CRC                   D8F9DD34 (3640253748)\n+3A40 Compressed Size       00000049 (73)\n+3A44 Uncompressed Size     0000004B (75)\n+3A48 Filename Length       0043 (67)\n+3A4A Extra Length          0000 (0)\n+3A4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A2D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3A70 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3A8F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3AB9 CENTRAL HEADER #1     02014B50 (33639248)\n-3ABD Created Zip Spec      14 (20) '2.0'\n-3ABE Created OS            03 (3) 'Unix'\n-3ABF Extract Zip Spec      14 (20) '2.0'\n-3AC0 Extract OS            00 (0) 'MS-DOS'\n-3AC1 General Purpose Flag  0800 (2048)\n+3AD8 CENTRAL HEADER #1     02014B50 (33639248)\n+3ADC Created Zip Spec      14 (20) '2.0'\n+3ADD Created OS            03 (3) 'Unix'\n+3ADE Extract Zip Spec      14 (20) '2.0'\n+3ADF Extract OS            00 (0) 'MS-DOS'\n+3AE0 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3AC3 Compression Method    0008 (8) 'Deflated'\n-3AC5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3AC9 CRC                   A689EB18 (2794056472)\n-3ACD Compressed Size       00000042 (66)\n-3AD1 Uncompressed Size     00000040 (64)\n-3AD5 Filename Length       0014 (20)\n-3AD7 Extra Length          0000 (0)\n-3AD9 Comment Length        0000 (0)\n-3ADB Disk Start            0000 (0)\n-3ADD Int File Attributes   0000 (0)\n+3AE2 Compression Method    0008 (8) 'Deflated'\n+3AE4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3AE8 CRC                   A689EB18 (2794056472)\n+3AEC Compressed Size       00000042 (66)\n+3AF0 Uncompressed Size     00000040 (64)\n+3AF4 Filename Length       0014 (20)\n+3AF6 Extra Length          0000 (0)\n+3AF8 Comment Length        0000 (0)\n+3AFA Disk Start            0000 (0)\n+3AFC Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3ADF Ext File Attributes   81A40000 (2175008768)\n+3AFE 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-3AE3 Local Header Offset   00000000 (0)\n-3AE7 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+3B02 Local Header Offset   00000000 (0)\n+3B06 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3AE7: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B06: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3AFB CENTRAL HEADER #2     02014B50 (33639248)\n-3AFF Created Zip Spec      14 (20) '2.0'\n-3B00 Created OS            03 (3) 'Unix'\n-3B01 Extract Zip Spec      0A (10) '1.0'\n-3B02 Extract OS            00 (0) 'MS-DOS'\n-3B03 General Purpose Flag  0800 (2048)\n+3B1A CENTRAL HEADER #2     02014B50 (33639248)\n+3B1E Created Zip Spec      14 (20) '2.0'\n+3B1F Created OS            03 (3) 'Unix'\n+3B20 Extract Zip Spec      0A (10) '1.0'\n+3B21 Extract OS            00 (0) 'MS-DOS'\n+3B22 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3B05 Compression Method    0000 (0) 'Stored'\n-3B07 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B0B CRC                   00000000 (0)\n-3B0F Compressed Size       00000000 (0)\n-3B13 Uncompressed Size     00000000 (0)\n-3B17 Filename Length       0009 (9)\n-3B19 Extra Length          0000 (0)\n-3B1B Comment Length        0000 (0)\n-3B1D Disk Start            0000 (0)\n-3B1F Int File Attributes   0000 (0)\n+3B24 Compression Method    0000 (0) 'Stored'\n+3B26 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B2A CRC                   00000000 (0)\n+3B2E Compressed Size       00000000 (0)\n+3B32 Uncompressed Size     00000000 (0)\n+3B36 Filename Length       0009 (9)\n+3B38 Extra Length          0000 (0)\n+3B3A Comment Length        0000 (0)\n+3B3C Disk Start            0000 (0)\n+3B3E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3B21 Ext File Attributes   41ED0010 (1106051088)\n+3B40 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-3B25 Local Header Offset   00000074 (116)\n-3B29 Filename              'XXXXXXXXX'\n+3B44 Local Header Offset   00000074 (116)\n+3B48 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x3B29: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x3B48: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3B29: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3B48: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3B01: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x3B20: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-3B32 CENTRAL HEADER #3     02014B50 (33639248)\n-3B36 Created Zip Spec      14 (20) '2.0'\n-3B37 Created OS            03 (3) 'Unix'\n-3B38 Extract Zip Spec      0A (10) '1.0'\n-3B39 Extract OS            00 (0) 'MS-DOS'\n-3B3A General Purpose Flag  0800 (2048)\n+3B51 CENTRAL HEADER #3     02014B50 (33639248)\n+3B55 Created Zip Spec      14 (20) '2.0'\n+3B56 Created OS            03 (3) 'Unix'\n+3B57 Extract Zip Spec      0A (10) '1.0'\n+3B58 Extract OS            00 (0) 'MS-DOS'\n+3B59 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3B3C Compression Method    0000 (0) 'Stored'\n-3B3E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B42 CRC                   00000000 (0)\n-3B46 Compressed Size       00000000 (0)\n-3B4A Uncompressed Size     00000000 (0)\n-3B4E Filename Length       0004 (4)\n-3B50 Extra Length          0000 (0)\n-3B52 Comment Length        0000 (0)\n-3B54 Disk Start            0000 (0)\n-3B56 Int File Attributes   0000 (0)\n+3B5B Compression Method    0000 (0) 'Stored'\n+3B5D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B61 CRC                   00000000 (0)\n+3B65 Compressed Size       00000000 (0)\n+3B69 Uncompressed Size     00000000 (0)\n+3B6D Filename Length       0004 (4)\n+3B6F Extra Length          0000 (0)\n+3B71 Comment Length        0000 (0)\n+3B73 Disk Start            0000 (0)\n+3B75 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3B58 Ext File Attributes   41ED0010 (1106051088)\n+3B77 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-3B5C Local Header Offset   0000009B (155)\n-3B60 Filename              'XXXX'\n+3B7B Local Header Offset   0000009B (155)\n+3B7F Filename              'XXXX'\n #\n-# WARNING: Offset 0x3B60: Filename 'XXXX'\n+# WARNING: Offset 0x3B7F: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3B60: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x3B7F: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3B38: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x3B57: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-3B64 CENTRAL HEADER #4     02014B50 (33639248)\n-3B68 Created Zip Spec      14 (20) '2.0'\n-3B69 Created OS            03 (3) 'Unix'\n-3B6A Extract Zip Spec      0A (10) '1.0'\n-3B6B Extract OS            00 (0) 'MS-DOS'\n-3B6C General Purpose Flag  0800 (2048)\n+3B83 CENTRAL HEADER #4     02014B50 (33639248)\n+3B87 Created Zip Spec      14 (20) '2.0'\n+3B88 Created OS            03 (3) 'Unix'\n+3B89 Extract Zip Spec      0A (10) '1.0'\n+3B8A Extract OS            00 (0) 'MS-DOS'\n+3B8B General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3B6E Compression Method    0000 (0) 'Stored'\n-3B70 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B74 CRC                   00000000 (0)\n-3B78 Compressed Size       00000000 (0)\n-3B7C Uncompressed Size     00000000 (0)\n-3B80 Filename Length       000B (11)\n-3B82 Extra Length          0000 (0)\n-3B84 Comment Length        0000 (0)\n-3B86 Disk Start            0000 (0)\n-3B88 Int File Attributes   0000 (0)\n+3B8D Compression Method    0000 (0) 'Stored'\n+3B8F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B93 CRC                   00000000 (0)\n+3B97 Compressed Size       00000000 (0)\n+3B9B Uncompressed Size     00000000 (0)\n+3B9F Filename Length       000B (11)\n+3BA1 Extra Length          0000 (0)\n+3BA3 Comment Length        0000 (0)\n+3BA5 Disk Start            0000 (0)\n+3BA7 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3B8A Ext File Attributes   41ED0010 (1106051088)\n+3BA9 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-3B8E Local Header Offset   000000BD (189)\n-3B92 Filename              'XXXXXXXXXXX'\n+3BAD Local Header Offset   000000BD (189)\n+3BB1 Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B92: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x3BB1: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3B92: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3BB1: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3B6A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x3B89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-3B9D CENTRAL HEADER #5     02014B50 (33639248)\n-3BA1 Created Zip Spec      14 (20) '2.0'\n-3BA2 Created OS            03 (3) 'Unix'\n-3BA3 Extract Zip Spec      0A (10) '1.0'\n-3BA4 Extract OS            00 (0) 'MS-DOS'\n-3BA5 General Purpose Flag  0800 (2048)\n+3BBC CENTRAL HEADER #5     02014B50 (33639248)\n+3BC0 Created Zip Spec      14 (20) '2.0'\n+3BC1 Created OS            03 (3) 'Unix'\n+3BC2 Extract Zip Spec      0A (10) '1.0'\n+3BC3 Extract OS            00 (0) 'MS-DOS'\n+3BC4 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3BA7 Compression Method    0000 (0) 'Stored'\n-3BA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BAD CRC                   00000000 (0)\n-3BB1 Compressed Size       00000000 (0)\n-3BB5 Uncompressed Size     00000000 (0)\n-3BB9 Filename Length       0011 (17)\n-3BBB Extra Length          0000 (0)\n-3BBD Comment Length        0000 (0)\n-3BBF Disk Start            0000 (0)\n-3BC1 Int File Attributes   0000 (0)\n+3BC6 Compression Method    0000 (0) 'Stored'\n+3BC8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3BCC CRC                   00000000 (0)\n+3BD0 Compressed Size       00000000 (0)\n+3BD4 Uncompressed Size     00000000 (0)\n+3BD8 Filename Length       0011 (17)\n+3BDA Extra Length          0000 (0)\n+3BDC Comment Length        0000 (0)\n+3BDE Disk Start            0000 (0)\n+3BE0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3BC3 Ext File Attributes   41ED0010 (1106051088)\n+3BE2 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-3BC7 Local Header Offset   000000E6 (230)\n-3BCB Filename              'XXXXXXXXXXXXXXXXX'\n+3BE6 Local Header Offset   000000E6 (230)\n+3BEA Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BCB: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BEA: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3BCB: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3BEA: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3BA3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BC2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-3BDC CENTRAL HEADER #6     02014B50 (33639248)\n-3BE0 Created Zip Spec      14 (20) '2.0'\n-3BE1 Created OS            03 (3) 'Unix'\n-3BE2 Extract Zip Spec      0A (10) '1.0'\n-3BE3 Extract OS            00 (0) 'MS-DOS'\n-3BE4 General Purpose Flag  0800 (2048)\n+3BFB CENTRAL HEADER #6     02014B50 (33639248)\n+3BFF Created Zip Spec      14 (20) '2.0'\n+3C00 Created OS            03 (3) 'Unix'\n+3C01 Extract Zip Spec      0A (10) '1.0'\n+3C02 Extract OS            00 (0) 'MS-DOS'\n+3C03 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3BE6 Compression Method    0000 (0) 'Stored'\n-3BE8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BEC CRC                   00000000 (0)\n-3BF0 Compressed Size       00000000 (0)\n-3BF4 Uncompressed Size     00000000 (0)\n-3BF8 Filename Length       001A (26)\n-3BFA Extra Length          0000 (0)\n-3BFC Comment Length        0000 (0)\n-3BFE Disk Start            0000 (0)\n-3C00 Int File Attributes   0000 (0)\n+3C05 Compression Method    0000 (0) 'Stored'\n+3C07 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C0B CRC                   00000000 (0)\n+3C0F Compressed Size       00000000 (0)\n+3C13 Uncompressed Size     00000000 (0)\n+3C17 Filename Length       001A (26)\n+3C19 Extra Length          0000 (0)\n+3C1B Comment Length        0000 (0)\n+3C1D Disk Start            0000 (0)\n+3C1F Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3C02 Ext File Attributes   41ED0010 (1106051088)\n+3C21 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-3C06 Local Header Offset   00000115 (277)\n-3C0A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C25 Local Header Offset   00000115 (277)\n+3C29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C0A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3C0A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3C29: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3BE2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C01: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3C24 CENTRAL HEADER #7     02014B50 (33639248)\n-3C28 Created Zip Spec      14 (20) '2.0'\n-3C29 Created OS            03 (3) 'Unix'\n-3C2A Extract Zip Spec      0A (10) '1.0'\n-3C2B Extract OS            00 (0) 'MS-DOS'\n-3C2C General Purpose Flag  0800 (2048)\n+3C43 CENTRAL HEADER #7     02014B50 (33639248)\n+3C47 Created Zip Spec      14 (20) '2.0'\n+3C48 Created OS            03 (3) 'Unix'\n+3C49 Extract Zip Spec      0A (10) '1.0'\n+3C4A Extract OS            00 (0) 'MS-DOS'\n+3C4B General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3C2E Compression Method    0000 (0) 'Stored'\n-3C30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C34 CRC                   00000000 (0)\n-3C38 Compressed Size       00000000 (0)\n-3C3C Uncompressed Size     00000000 (0)\n-3C40 Filename Length       001F (31)\n-3C42 Extra Length          0000 (0)\n-3C44 Comment Length        0000 (0)\n-3C46 Disk Start            0000 (0)\n-3C48 Int File Attributes   0000 (0)\n+3C4D Compression Method    0000 (0) 'Stored'\n+3C4F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C53 CRC                   00000000 (0)\n+3C57 Compressed Size       00000000 (0)\n+3C5B Uncompressed Size     00000000 (0)\n+3C5F Filename Length       001F (31)\n+3C61 Extra Length          0000 (0)\n+3C63 Comment Length        0000 (0)\n+3C65 Disk Start            0000 (0)\n+3C67 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3C4A Ext File Attributes   41ED0010 (1106051088)\n+3C69 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-3C4E Local Header Offset   0000014D (333)\n-3C52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C6D Local Header Offset   0000014D (333)\n+3C71 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C71: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3C52: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3C71: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3C2A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3C71 CENTRAL HEADER #8     02014B50 (33639248)\n-3C75 Created Zip Spec      14 (20) '2.0'\n-3C76 Created OS            03 (3) 'Unix'\n-3C77 Extract Zip Spec      0A (10) '1.0'\n-3C78 Extract OS            00 (0) 'MS-DOS'\n-3C79 General Purpose Flag  0800 (2048)\n+3C90 CENTRAL HEADER #8     02014B50 (33639248)\n+3C94 Created Zip Spec      14 (20) '2.0'\n+3C95 Created OS            03 (3) 'Unix'\n+3C96 Extract Zip Spec      0A (10) '1.0'\n+3C97 Extract OS            00 (0) 'MS-DOS'\n+3C98 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3C7B Compression Method    0000 (0) 'Stored'\n-3C7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C81 CRC                   00000000 (0)\n-3C85 Compressed Size       00000000 (0)\n-3C89 Uncompressed Size     00000000 (0)\n-3C8D Filename Length       000F (15)\n-3C8F Extra Length          0000 (0)\n-3C91 Comment Length        0000 (0)\n-3C93 Disk Start            0000 (0)\n-3C95 Int File Attributes   0000 (0)\n+3C9A Compression Method    0000 (0) 'Stored'\n+3C9C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3CA0 CRC                   00000000 (0)\n+3CA4 Compressed Size       00000000 (0)\n+3CA8 Uncompressed Size     00000000 (0)\n+3CAC Filename Length       000F (15)\n+3CAE Extra Length          0000 (0)\n+3CB0 Comment Length        0000 (0)\n+3CB2 Disk Start            0000 (0)\n+3CB4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3C97 Ext File Attributes   41ED0010 (1106051088)\n+3CB6 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-3C9B Local Header Offset   0000018A (394)\n-3C9F Filename              'XXXXXXXXXXXXXXX'\n+3CBA Local Header Offset   0000018A (394)\n+3CBE Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C9F: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CBE: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3C9F: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3CBE: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3C77: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C96: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-3CAE CENTRAL HEADER #9     02014B50 (33639248)\n-3CB2 Created Zip Spec      14 (20) '2.0'\n-3CB3 Created OS            03 (3) 'Unix'\n-3CB4 Extract Zip Spec      0A (10) '1.0'\n-3CB5 Extract OS            00 (0) 'MS-DOS'\n-3CB6 General Purpose Flag  0800 (2048)\n+3CCD CENTRAL HEADER #9     02014B50 (33639248)\n+3CD1 Created Zip Spec      14 (20) '2.0'\n+3CD2 Created OS            03 (3) 'Unix'\n+3CD3 Extract Zip Spec      0A (10) '1.0'\n+3CD4 Extract OS            00 (0) 'MS-DOS'\n+3CD5 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3CB8 Compression Method    0000 (0) 'Stored'\n-3CBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3CBE CRC                   00000000 (0)\n-3CC2 Compressed Size       00000000 (0)\n-3CC6 Uncompressed Size     00000000 (0)\n-3CCA Filename Length       0018 (24)\n-3CCC Extra Length          0000 (0)\n-3CCE Comment Length        0000 (0)\n-3CD0 Disk Start            0000 (0)\n-3CD2 Int File Attributes   0000 (0)\n+3CD7 Compression Method    0000 (0) 'Stored'\n+3CD9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3CDD CRC                   00000000 (0)\n+3CE1 Compressed Size       00000000 (0)\n+3CE5 Uncompressed Size     00000000 (0)\n+3CE9 Filename Length       0018 (24)\n+3CEB Extra Length          0000 (0)\n+3CED Comment Length        0000 (0)\n+3CEF Disk Start            0000 (0)\n+3CF1 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3CD4 Ext File Attributes   41ED0010 (1106051088)\n+3CF3 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-3CD8 Local Header Offset   000001B7 (439)\n-3CDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+3CF7 Local Header Offset   000001B7 (439)\n+3CFB Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3CDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CFB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3CDC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3CFB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3CB4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CD3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3CF4 CENTRAL HEADER #10    02014B50 (33639248)\n-3CF8 Created Zip Spec      14 (20) '2.0'\n-3CF9 Created OS            03 (3) 'Unix'\n-3CFA Extract Zip Spec      0A (10) '1.0'\n-3CFB Extract OS            00 (0) 'MS-DOS'\n-3CFC General Purpose Flag  0800 (2048)\n+3D13 CENTRAL HEADER #10    02014B50 (33639248)\n+3D17 Created Zip Spec      14 (20) '2.0'\n+3D18 Created OS            03 (3) 'Unix'\n+3D19 Extract Zip Spec      0A (10) '1.0'\n+3D1A Extract OS            00 (0) 'MS-DOS'\n+3D1B General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3CFE Compression Method    0000 (0) 'Stored'\n-3D00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D04 CRC                   00000000 (0)\n-3D08 Compressed Size       00000000 (0)\n-3D0C Uncompressed Size     00000000 (0)\n-3D10 Filename Length       000F (15)\n-3D12 Extra Length          0000 (0)\n-3D14 Comment Length        0000 (0)\n-3D16 Disk Start            0000 (0)\n-3D18 Int File Attributes   0000 (0)\n+3D1D Compression Method    0000 (0) 'Stored'\n+3D1F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D23 CRC                   00000000 (0)\n+3D27 Compressed Size       00000000 (0)\n+3D2B Uncompressed Size     00000000 (0)\n+3D2F Filename Length       000F (15)\n+3D31 Extra Length          0000 (0)\n+3D33 Comment Length        0000 (0)\n+3D35 Disk Start            0000 (0)\n+3D37 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3D1A Ext File Attributes   41ED0010 (1106051088)\n+3D39 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-3D1E Local Header Offset   000001ED (493)\n-3D22 Filename              'XXXXXXXXXXXXXXX'\n+3D3D Local Header Offset   000001ED (493)\n+3D41 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D22: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D41: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3D22: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3D41: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3CFA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D19: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-3D31 CENTRAL HEADER #11    02014B50 (33639248)\n-3D35 Created Zip Spec      14 (20) '2.0'\n-3D36 Created OS            03 (3) 'Unix'\n-3D37 Extract Zip Spec      0A (10) '1.0'\n-3D38 Extract OS            00 (0) 'MS-DOS'\n-3D39 General Purpose Flag  0800 (2048)\n+3D50 CENTRAL HEADER #11    02014B50 (33639248)\n+3D54 Created Zip Spec      14 (20) '2.0'\n+3D55 Created OS            03 (3) 'Unix'\n+3D56 Extract Zip Spec      0A (10) '1.0'\n+3D57 Extract OS            00 (0) 'MS-DOS'\n+3D58 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3D3B Compression Method    0000 (0) 'Stored'\n-3D3D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D41 CRC                   00000000 (0)\n-3D45 Compressed Size       00000000 (0)\n-3D49 Uncompressed Size     00000000 (0)\n-3D4D Filename Length       0020 (32)\n-3D4F Extra Length          0000 (0)\n-3D51 Comment Length        0000 (0)\n-3D53 Disk Start            0000 (0)\n-3D55 Int File Attributes   0000 (0)\n+3D5A Compression Method    0000 (0) 'Stored'\n+3D5C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D60 CRC                   00000000 (0)\n+3D64 Compressed Size       00000000 (0)\n+3D68 Uncompressed Size     00000000 (0)\n+3D6C Filename Length       0020 (32)\n+3D6E Extra Length          0000 (0)\n+3D70 Comment Length        0000 (0)\n+3D72 Disk Start            0000 (0)\n+3D74 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3D57 Ext File Attributes   41ED0010 (1106051088)\n+3D76 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-3D5B Local Header Offset   0000021A (538)\n-3D5F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D7A Local Header Offset   0000021A (538)\n+3D7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D5F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3D5F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3D7E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3D37: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D56: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3D7F CENTRAL HEADER #12    02014B50 (33639248)\n-3D83 Created Zip Spec      14 (20) '2.0'\n-3D84 Created OS            03 (3) 'Unix'\n-3D85 Extract Zip Spec      0A (10) '1.0'\n-3D86 Extract OS            00 (0) 'MS-DOS'\n-3D87 General Purpose Flag  0800 (2048)\n+3D9E CENTRAL HEADER #12    02014B50 (33639248)\n+3DA2 Created Zip Spec      14 (20) '2.0'\n+3DA3 Created OS            03 (3) 'Unix'\n+3DA4 Extract Zip Spec      0A (10) '1.0'\n+3DA5 Extract OS            00 (0) 'MS-DOS'\n+3DA6 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3D89 Compression Method    0000 (0) 'Stored'\n-3D8B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D8F CRC                   00000000 (0)\n-3D93 Compressed Size       00000000 (0)\n-3D97 Uncompressed Size     00000000 (0)\n-3D9B Filename Length       0035 (53)\n-3D9D Extra Length          0000 (0)\n-3D9F Comment Length        0000 (0)\n-3DA1 Disk Start            0000 (0)\n-3DA3 Int File Attributes   0000 (0)\n+3DA8 Compression Method    0000 (0) 'Stored'\n+3DAA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3DAE CRC                   00000000 (0)\n+3DB2 Compressed Size       00000000 (0)\n+3DB6 Uncompressed Size     00000000 (0)\n+3DBA Filename Length       0035 (53)\n+3DBC Extra Length          0000 (0)\n+3DBE Comment Length        0000 (0)\n+3DC0 Disk Start            0000 (0)\n+3DC2 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3DA5 Ext File Attributes   41ED0010 (1106051088)\n+3DC4 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-3DA9 Local Header Offset   00000258 (600)\n-3DAD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3DC8 Local Header Offset   00000258 (600)\n+3DCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3DAD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3DCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3DAD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3DCC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3D85: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3DA4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3DE2 CENTRAL HEADER #13    02014B50 (33639248)\n-3DE6 Created Zip Spec      14 (20) '2.0'\n-3DE7 Created OS            03 (3) 'Unix'\n-3DE8 Extract Zip Spec      14 (20) '2.0'\n-3DE9 Extract OS            00 (0) 'MS-DOS'\n-3DEA General Purpose Flag  0800 (2048)\n+3E01 CENTRAL HEADER #13    02014B50 (33639248)\n+3E05 Created Zip Spec      14 (20) '2.0'\n+3E06 Created OS            03 (3) 'Unix'\n+3E07 Extract Zip Spec      14 (20) '2.0'\n+3E08 Extract OS            00 (0) 'MS-DOS'\n+3E09 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3DEC Compression Method    0008 (8) 'Deflated'\n-3DEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3DF2 CRC                   36ACB63B (917288507)\n-3DF6 Compressed Size       00000838 (2104)\n-3DFA Uncompressed Size     00002D46 (11590)\n-3DFE Filename Length       0015 (21)\n-3E00 Extra Length          0000 (0)\n-3E02 Comment Length        0000 (0)\n-3E04 Disk Start            0000 (0)\n-3E06 Int File Attributes   0000 (0)\n+3E0B Compression Method    0008 (8) 'Deflated'\n+3E0D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3E11 CRC                   36ACB63B (917288507)\n+3E15 Compressed Size       00000838 (2104)\n+3E19 Uncompressed Size     00002D46 (11590)\n+3E1D Filename Length       0015 (21)\n+3E1F Extra Length          0000 (0)\n+3E21 Comment Length        0000 (0)\n+3E23 Disk Start            0000 (0)\n+3E25 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3E08 Ext File Attributes   81A40000 (2175008768)\n+3E27 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-3E0C Local Header Offset   000002AB (683)\n-3E10 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+3E2B Local Header Offset   000002AB (683)\n+3E2F Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E10: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E2F: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3E25 CENTRAL HEADER #14    02014B50 (33639248)\n-3E29 Created Zip Spec      14 (20) '2.0'\n-3E2A Created OS            03 (3) 'Unix'\n-3E2B Extract Zip Spec      14 (20) '2.0'\n-3E2C Extract OS            00 (0) 'MS-DOS'\n-3E2D General Purpose Flag  0800 (2048)\n+3E44 CENTRAL HEADER #14    02014B50 (33639248)\n+3E48 Created Zip Spec      14 (20) '2.0'\n+3E49 Created OS            03 (3) 'Unix'\n+3E4A Extract Zip Spec      14 (20) '2.0'\n+3E4B Extract OS            00 (0) 'MS-DOS'\n+3E4C General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3E2F Compression Method    0008 (8) 'Deflated'\n-3E31 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3E35 CRC                   86E2B4B4 (2263004340)\n-3E39 Compressed Size       00000F6D (3949)\n-3E3D Uncompressed Size     00002C5E (11358)\n-3E41 Filename Length       0010 (16)\n-3E43 Extra Length          0000 (0)\n-3E45 Comment Length        0000 (0)\n-3E47 Disk Start            0000 (0)\n-3E49 Int File Attributes   0000 (0)\n+3E4E Compression Method    0008 (8) 'Deflated'\n+3E50 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3E54 CRC                   86E2B4B4 (2263004340)\n+3E58 Compressed Size       00000F6D (3949)\n+3E5C Uncompressed Size     00002C5E (11358)\n+3E60 Filename Length       0010 (16)\n+3E62 Extra Length          0000 (0)\n+3E64 Comment Length        0000 (0)\n+3E66 Disk Start            0000 (0)\n+3E68 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3E4B Ext File Attributes   81A40000 (2175008768)\n+3E6A 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-3E4F Local Header Offset   00000B16 (2838)\n-3E53 Filename              'XXXXXXXXXXXXXXXX'\n+3E6E Local Header Offset   00000B16 (2838)\n+3E72 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E53: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E72: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3E63 CENTRAL HEADER #15    02014B50 (33639248)\n-3E67 Created Zip Spec      14 (20) '2.0'\n-3E68 Created OS            03 (3) 'Unix'\n-3E69 Extract Zip Spec      14 (20) '2.0'\n-3E6A Extract OS            00 (0) 'MS-DOS'\n-3E6B General Purpose Flag  0800 (2048)\n+3E82 CENTRAL HEADER #15    02014B50 (33639248)\n+3E86 Created Zip Spec      14 (20) '2.0'\n+3E87 Created OS            03 (3) 'Unix'\n+3E88 Extract Zip Spec      14 (20) '2.0'\n+3E89 Extract OS            00 (0) 'MS-DOS'\n+3E8A General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3E6D Compression Method    0008 (8) 'Deflated'\n-3E6F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3E73 CRC                   0B8AFFD7 (193658839)\n-3E77 Compressed Size       00000082 (130)\n-3E7B Uncompressed Size     000000B1 (177)\n-3E7F Filename Length       000F (15)\n-3E81 Extra Length          0000 (0)\n-3E83 Comment Length        0000 (0)\n-3E85 Disk Start            0000 (0)\n-3E87 Int File Attributes   0000 (0)\n+3E8C Compression Method    0008 (8) 'Deflated'\n+3E8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3E92 CRC                   0B8AFFD7 (193658839)\n+3E96 Compressed Size       00000082 (130)\n+3E9A Uncompressed Size     000000B1 (177)\n+3E9E Filename Length       000F (15)\n+3EA0 Extra Length          0000 (0)\n+3EA2 Comment Length        0000 (0)\n+3EA4 Disk Start            0000 (0)\n+3EA6 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3E89 Ext File Attributes   81A40000 (2175008768)\n+3EA8 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-3E8D Local Header Offset   00001AB1 (6833)\n-3E91 Filename              'XXXXXXXXXXXXXXX'\n+3EAC Local Header Offset   00001AB1 (6833)\n+3EB0 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E91: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3EB0: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3EA0 CENTRAL HEADER #16    02014B50 (33639248)\n-3EA4 Created Zip Spec      14 (20) '2.0'\n-3EA5 Created OS            03 (3) 'Unix'\n-3EA6 Extract Zip Spec      14 (20) '2.0'\n-3EA7 Extract OS            00 (0) 'MS-DOS'\n-3EA8 General Purpose Flag  0800 (2048)\n+3EBF CENTRAL HEADER #16    02014B50 (33639248)\n+3EC3 Created Zip Spec      14 (20) '2.0'\n+3EC4 Created OS            03 (3) 'Unix'\n+3EC5 Extract Zip Spec      14 (20) '2.0'\n+3EC6 Extract OS            00 (0) 'MS-DOS'\n+3EC7 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3EAA Compression Method    0008 (8) 'Deflated'\n-3EAC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3EB0 CRC                   E5134667 (3843245671)\n-3EB4 Compressed Size       00000D7E (3454)\n-3EB8 Uncompressed Size     00003DF8 (15864)\n-3EBC Filename Length       0030 (48)\n-3EBE Extra Length          0000 (0)\n-3EC0 Comment Length        0000 (0)\n-3EC2 Disk Start            0000 (0)\n-3EC4 Int File Attributes   0000 (0)\n+3EC9 Compression Method    0008 (8) 'Deflated'\n+3ECB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3ECF CRC                   775C02B8 (2002518712)\n+3ED3 Compressed Size       00000D8F (3471)\n+3ED7 Uncompressed Size     00003F5B (16219)\n+3EDB Filename Length       0030 (48)\n+3EDD Extra Length          0000 (0)\n+3EDF Comment Length        0000 (0)\n+3EE1 Disk Start            0000 (0)\n+3EE3 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3EC6 Ext File Attributes   81A40000 (2175008768)\n+3EE5 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-3ECA Local Header Offset   00001B60 (7008)\n-3ECE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3EE9 Local Header Offset   00001B60 (7008)\n+3EED Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3ECE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3EED: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3EFE CENTRAL HEADER #17    02014B50 (33639248)\n-3F02 Created Zip Spec      14 (20) '2.0'\n-3F03 Created OS            03 (3) 'Unix'\n-3F04 Extract Zip Spec      14 (20) '2.0'\n-3F05 Extract OS            00 (0) 'MS-DOS'\n-3F06 General Purpose Flag  0800 (2048)\n+3F1D CENTRAL HEADER #17    02014B50 (33639248)\n+3F21 Created Zip Spec      14 (20) '2.0'\n+3F22 Created OS            03 (3) 'Unix'\n+3F23 Extract Zip Spec      14 (20) '2.0'\n+3F24 Extract OS            00 (0) 'MS-DOS'\n+3F25 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3F08 Compression Method    0008 (8) 'Deflated'\n-3F0A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F0E CRC                   EAAFA7AC (3937380268)\n-3F12 Compressed Size       00000291 (657)\n-3F16 Uncompressed Size     00000581 (1409)\n-3F1A Filename Length       0037 (55)\n-3F1C Extra Length          0000 (0)\n-3F1E Comment Length        0000 (0)\n-3F20 Disk Start            0000 (0)\n-3F22 Int File Attributes   0000 (0)\n+3F27 Compression Method    0008 (8) 'Deflated'\n+3F29 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3F2D CRC                   C7AB4B17 (3349891863)\n+3F31 Compressed Size       0000029A (666)\n+3F35 Uncompressed Size     000005A5 (1445)\n+3F39 Filename Length       0037 (55)\n+3F3B Extra Length          0000 (0)\n+3F3D Comment Length        0000 (0)\n+3F3F Disk Start            0000 (0)\n+3F41 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3F24 Ext File Attributes   81A40000 (2175008768)\n+3F43 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-3F28 Local Header Offset   0000292C (10540)\n-3F2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3F47 Local Header Offset   0000293D (10557)\n+3F4B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3F4B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3F63 CENTRAL HEADER #18    02014B50 (33639248)\n-3F67 Created Zip Spec      14 (20) '2.0'\n-3F68 Created OS            03 (3) 'Unix'\n-3F69 Extract Zip Spec      14 (20) '2.0'\n-3F6A Extract OS            00 (0) 'MS-DOS'\n-3F6B General Purpose Flag  0800 (2048)\n+3F82 CENTRAL HEADER #18    02014B50 (33639248)\n+3F86 Created Zip Spec      14 (20) '2.0'\n+3F87 Created OS            03 (3) 'Unix'\n+3F88 Extract Zip Spec      14 (20) '2.0'\n+3F89 Extract OS            00 (0) 'MS-DOS'\n+3F8A General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3F6D Compression Method    0008 (8) 'Deflated'\n-3F6F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3F73 CRC                   D94FAF9D (3645878173)\n-3F77 Compressed Size       000008BF (2239)\n-3F7B Uncompressed Size     00001FF4 (8180)\n-3F7F Filename Length       0038 (56)\n-3F81 Extra Length          0000 (0)\n-3F83 Comment Length        0000 (0)\n-3F85 Disk Start            0000 (0)\n-3F87 Int File Attributes   0000 (0)\n+3F8C Compression Method    0008 (8) 'Deflated'\n+3F8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3F92 CRC                   935B5779 (2472236921)\n+3F96 Compressed Size       000008C9 (2249)\n+3F9A Uncompressed Size     000020C2 (8386)\n+3F9E Filename Length       0038 (56)\n+3FA0 Extra Length          0000 (0)\n+3FA2 Comment Length        0000 (0)\n+3FA4 Disk Start            0000 (0)\n+3FA6 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3F89 Ext File Attributes   81A40000 (2175008768)\n+3FA8 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-3F8D Local Header Offset   00002C12 (11282)\n-3F91 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3FAC Local Header Offset   00002C2C (11308)\n+3FB0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3F91: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3FB0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3FC9 CENTRAL HEADER #19    02014B50 (33639248)\n-3FCD Created Zip Spec      14 (20) '2.0'\n-3FCE Created OS            03 (3) 'Unix'\n-3FCF Extract Zip Spec      14 (20) '2.0'\n-3FD0 Extract OS            00 (0) 'MS-DOS'\n-3FD1 General Purpose Flag  0800 (2048)\n+3FE8 CENTRAL HEADER #19    02014B50 (33639248)\n+3FEC Created Zip Spec      14 (20) '2.0'\n+3FED Created OS            03 (3) 'Unix'\n+3FEE Extract Zip Spec      14 (20) '2.0'\n+3FEF Extract OS            00 (0) 'MS-DOS'\n+3FF0 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3FD3 Compression Method    0008 (8) 'Deflated'\n-3FD5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3FD9 CRC                   8176D79D (2172049309)\n-3FDD Compressed Size       00000032 (50)\n-3FE1 Uncompressed Size     00000038 (56)\n-3FE5 Filename Length       0041 (65)\n-3FE7 Extra Length          0000 (0)\n-3FE9 Comment Length        0000 (0)\n-3FEB Disk Start            0000 (0)\n-3FED Int File Attributes   0000 (0)\n+3FF2 Compression Method    0008 (8) 'Deflated'\n+3FF4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3FF8 CRC                   8176D79D (2172049309)\n+3FFC Compressed Size       00000032 (50)\n+4000 Uncompressed Size     00000038 (56)\n+4004 Filename Length       0041 (65)\n+4006 Extra Length          0000 (0)\n+4008 Comment Length        0000 (0)\n+400A Disk Start            0000 (0)\n+400C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3FEF Ext File Attributes   81A40000 (2175008768)\n+400E 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-3FF3 Local Header Offset   00003527 (13607)\n-3FF7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4012 Local Header Offset   0000354B (13643)\n+4016 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3FF7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4016: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4038 CENTRAL HEADER #20    02014B50 (33639248)\n-403C Created Zip Spec      14 (20) '2.0'\n-403D Created OS            03 (3) 'Unix'\n-403E Extract Zip Spec      14 (20) '2.0'\n-403F Extract OS            00 (0) 'MS-DOS'\n-4040 General Purpose Flag  0800 (2048)\n+4057 CENTRAL HEADER #20    02014B50 (33639248)\n+405B Created Zip Spec      14 (20) '2.0'\n+405C Created OS            03 (3) 'Unix'\n+405D Extract Zip Spec      14 (20) '2.0'\n+405E Extract OS            00 (0) 'MS-DOS'\n+405F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4042 Compression Method    0008 (8) 'Deflated'\n-4044 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4048 CRC                   09788912 (158894354)\n-404C Compressed Size       00000039 (57)\n-4050 Uncompressed Size     0000003A (58)\n-4054 Filename Length       0049 (73)\n-4056 Extra Length          0000 (0)\n-4058 Comment Length        0000 (0)\n-405A Disk Start            0000 (0)\n-405C Int File Attributes   0000 (0)\n+4061 Compression Method    0008 (8) 'Deflated'\n+4063 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4067 CRC                   8E269995 (2384894357)\n+406B Compressed Size       0000003A (58)\n+406F Uncompressed Size     0000003B (59)\n+4073 Filename Length       0049 (73)\n+4075 Extra Length          0000 (0)\n+4077 Comment Length        0000 (0)\n+4079 Disk Start            0000 (0)\n+407B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-405E Ext File Attributes   81A40000 (2175008768)\n+407D 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-4062 Local Header Offset   000035B8 (13752)\n-4066 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4081 Local Header Offset   000035DC (13788)\n+4085 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4066: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4085: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-40AF CENTRAL HEADER #21    02014B50 (33639248)\n-40B3 Created Zip Spec      14 (20) '2.0'\n-40B4 Created OS            03 (3) 'Unix'\n-40B5 Extract Zip Spec      14 (20) '2.0'\n-40B6 Extract OS            00 (0) 'MS-DOS'\n-40B7 General Purpose Flag  0800 (2048)\n+40CE CENTRAL HEADER #21    02014B50 (33639248)\n+40D2 Created Zip Spec      14 (20) '2.0'\n+40D3 Created OS            03 (3) 'Unix'\n+40D4 Extract Zip Spec      14 (20) '2.0'\n+40D5 Extract OS            00 (0) 'MS-DOS'\n+40D6 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-40B9 Compression Method    0008 (8) 'Deflated'\n-40BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-40BF CRC                   8F421884 (2403473540)\n-40C3 Compressed Size       0000035D (861)\n-40C7 Uncompressed Size     000008FC (2300)\n-40CB Filename Length       003C (60)\n-40CD Extra Length          0000 (0)\n-40CF Comment Length        0000 (0)\n-40D1 Disk Start            0000 (0)\n-40D3 Int File Attributes   0000 (0)\n+40D8 Compression Method    0008 (8) 'Deflated'\n+40DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+40DE CRC                   69F6084D (1777731661)\n+40E2 Compressed Size       00000357 (855)\n+40E6 Uncompressed Size     000008C5 (2245)\n+40EA Filename Length       003C (60)\n+40EC Extra Length          0000 (0)\n+40EE Comment Length        0000 (0)\n+40F0 Disk Start            0000 (0)\n+40F2 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-40D5 Ext File Attributes   81A40000 (2175008768)\n+40F4 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-40D9 Local Header Offset   00003658 (13912)\n-40DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+40F8 Local Header Offset   0000367D (13949)\n+40FC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x40DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x40FC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4119 CENTRAL HEADER #22    02014B50 (33639248)\n-411D Created Zip Spec      14 (20) '2.0'\n-411E Created OS            03 (3) 'Unix'\n-411F Extract Zip Spec      14 (20) '2.0'\n-4120 Extract OS            00 (0) 'MS-DOS'\n-4121 General Purpose Flag  0800 (2048)\n+4138 CENTRAL HEADER #22    02014B50 (33639248)\n+413C Created Zip Spec      14 (20) '2.0'\n+413D Created OS            03 (3) 'Unix'\n+413E Extract Zip Spec      14 (20) '2.0'\n+413F Extract OS            00 (0) 'MS-DOS'\n+4140 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4123 Compression Method    0008 (8) 'Deflated'\n-4125 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4129 CRC                   D8F9DD34 (3640253748)\n-412D Compressed Size       00000049 (73)\n-4131 Uncompressed Size     0000004B (75)\n-4135 Filename Length       0043 (67)\n-4137 Extra Length          0000 (0)\n-4139 Comment Length        0000 (0)\n-413B Disk Start            0000 (0)\n-413D Int File Attributes   0000 (0)\n+4142 Compression Method    0008 (8) 'Deflated'\n+4144 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4148 CRC                   D8F9DD34 (3640253748)\n+414C Compressed Size       00000049 (73)\n+4150 Uncompressed Size     0000004B (75)\n+4154 Filename Length       0043 (67)\n+4156 Extra Length          0000 (0)\n+4158 Comment Length        0000 (0)\n+415A Disk Start            0000 (0)\n+415C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-413F Ext File Attributes   81A40000 (2175008768)\n+415E 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-4143 Local Header Offset   00003A0F (14863)\n-4147 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4162 Local Header Offset   00003A2E (14894)\n+4166 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4147: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4166: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-418A END CENTRAL HEADER    06054B50 (101010256)\n-418E Number of this disk   0000 (0)\n-4190 Central Dir Disk no   0000 (0)\n-4192 Entries in this disk  0016 (22)\n-4194 Total Entries         0016 (22)\n-4196 Size of Central Dir   000006D1 (1745)\n-419A Offset to Central Dir 00003AB9 (15033)\n-419E Comment Length        0000 (0)\n+41A9 END CENTRAL HEADER    06054B50 (101010256)\n+41AD Number of this disk   0000 (0)\n+41AF Central Dir Disk no   0000 (0)\n+41B1 Entries in this disk  0016 (22)\n+41B3 Total Entries         0016 (22)\n+41B5 Size of Central Dir   000006D1 (1745)\n+41B9 Offset to Central Dir 00003AD8 (15064)\n+41BD Comment Length        0000 (0)\n #\n # Error Count: 11\n # Warning Count: 55\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/etcd/EtcdRegistry.java", "source2": "org/apache/dubbo/registry/etcd/EtcdRegistry.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,355 +1,355 @@\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.etcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\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.remoting.etcd.ChildListener;\n-import org.apache.dubbo.remoting.etcd.Constants;\n-import org.apache.dubbo.remoting.etcd.EtcdClient;\n-import org.apache.dubbo.remoting.etcd.EtcdTransporter;\n-import org.apache.dubbo.remoting.etcd.StateListener;\n-import org.apache.dubbo.remoting.etcd.option.OptionUtil;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import java.util.ArrayList;\n-import java.util.Arrays;\n-import java.util.List;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\n-import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\n-\n-\n-/**\n- * Support for ectd3 registry.\n- */\n-public class EtcdRegistry extends FailbackRegistry {\n-\n-    private final static int DEFAULT_ETCD_PORT = 2379;\n-\n-    private final static String DEFAULT_ROOT = \"dubbo\";\n-\n-    private final String root;\n-\n-    private final Set<String> anyServices = new ConcurrentHashSet<>();\n-\n-    private final ConcurrentMap<URL, ConcurrentMap<NotifyListener, ChildListener>> etcdListeners = new ConcurrentHashMap<>();\n-    private final EtcdClient etcdClient;\n-\n-    public EtcdRegistry(URL url, EtcdTransporter etcdTransporter) {\n-        super(url);\n-        if (url.isAnyHost()) {\n-            throw new IllegalStateException(\"registry address is invalid, actual: '\" + url.getHost() + \"'\");\n-        }\n-        String group = url.getParameter(GROUP_KEY, DEFAULT_ROOT);\n-        if (!group.startsWith(PATH_SEPARATOR)) {\n-            group = PATH_SEPARATOR + group;\n-        }\n-        this.root = group;\n-        etcdClient = etcdTransporter.connect(url);\n-\n-        etcdClient.addStateListener(state -> {\n-            if (state == StateListener.CONNECTED) {\n-                try {\n-                    recover();\n-                } catch (Exception e) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-        });\n-    }\n-\n-    protected static String appendDefaultPort(String address) {\n-        if (address != null && address.length() > 0) {\n-            int i = address.indexOf(':');\n-            if (i < 0) {\n-                return address + \":\" + DEFAULT_ETCD_PORT;\n-            } else if (Integer.parseInt(address.substring(i + 1)) == 0) {\n-                return address.substring(0, i + 1) + DEFAULT_ETCD_PORT;\n-            }\n-        }\n-        return address;\n-    }\n-\n-    @Override\n-    public void doRegister(URL url) {\n-        try {\n-            String path = toUrlPath(url);\n-            if (url.getParameter(DYNAMIC_KEY, true)) {\n-                etcdClient.createEphemeral(path);\n-                return;\n-            }\n-            etcdClient.create(path);\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to register \" + url + \" to etcd \" + getUrl()\n-                    + \", cause: \" + (OptionUtil.isProtocolError(e)\n-                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\n-                    : e.getMessage()), e);\n-        }\n-    }\n-\n-    @Override\n-    public void doUnregister(URL url) {\n-        try {\n-            String path = toUrlPath(url);\n-            etcdClient.delete(path);\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to unregister \" + url + \" to etcd \" + getUrl() + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    @Override\n-    public void doSubscribe(URL url, NotifyListener listener) {\n-        try {\n-            if (ANY_VALUE.equals(url.getServiceInterface())) {\n-                String root = toRootPath();\n-\n-                /*\n-                 *  if we are interested in all interfaces,\n-                 *  find out the current container or create one for the url, put or get only once.\n-                 */\n-                ConcurrentMap<NotifyListener, ChildListener> listeners =\n-                        Optional.ofNullable(etcdListeners.get(url))\n-                                .orElseGet(() -> {\n-                                    ConcurrentMap<NotifyListener, ChildListener> container, prev;\n-                                    prev = etcdListeners.putIfAbsent(url, container = new ConcurrentHashMap<>());\n-                                    return prev != null ? prev : container;\n-                                });\n-\n-                /*\n-                 *  if we have no interface watcher listener,\n-                 *  find the current listener or create one for the current root, put or get only once.\n-                 */\n-                ChildListener interfaceListener =\n-                        Optional.ofNullable(listeners.get(listener))\n-                                .orElseGet(() -> {\n-                                    ChildListener childListener, prev;\n-                                    prev = listeners.putIfAbsent(listener, childListener = (parentPath, currentChildren) -> {\n-                                        /*\n-                                         *  because etcd3 does not support direct children watch events,\n-                                         *  we should filter not interface events. if we watch /dubbo\n-                                         *  and /dubbo/interface, when we put a key-value pair {/dubbo/interface/hello hello},\n-                                         *  we will got events in watching path /dubbo.\n-                                         */\n-                                        for (String child : currentChildren) {\n-                                            child = URL.decode(child);\n-                                            if (!anyServices.contains(child)) {\n-                                                anyServices.add(child);\n-                                                /*\n-                                                 *  if new interface event arrived, we watch their direct children,\n-                                                 *  eg: /dubbo/interface, /dubbo/interface and so on.\n-                                                 */\n-                                                subscribe(url.setPath(child).addParameters(INTERFACE_KEY, child,\n-                                                        CHECK_KEY, String.valueOf(false)), listener);\n-                                            }\n-                                        }\n-                                    });\n-                                    return prev != null ? prev : childListener;\n-                                });\n-\n-                etcdClient.create(root);\n-                /*\n-                 * at the first time, we want to pull already interface and then watch their direct children,\n-                 *  eg: /dubbo/interface, /dubbo/interface and so on.\n-                 */\n-                List<String> services = etcdClient.addChildListener(root, interfaceListener);\n-                for (String service : services) {\n-                    service = URL.decode(service);\n-                    anyServices.add(service);\n-                    subscribe(url.setPath(service).addParameters(INTERFACE_KEY, service,\n-                            CHECK_KEY, String.valueOf(false)), listener);\n-                }\n-            } else {\n-                List<URL> urls = new ArrayList<>();\n-                for (String path : toCategoriesPath(url)) {\n-\n-                    /*\n-                     *  if we are interested in special categories (providers, consumers, routers and so on),\n-                     *  we find out the current container or create one for the url, put or get only once.\n-                     */\n-                    ConcurrentMap<NotifyListener, ChildListener> listeners =\n-                            Optional.ofNullable(etcdListeners.get(url))\n-                                    .orElseGet(() -> {\n-                                        ConcurrentMap<NotifyListener, ChildListener> container, prev;\n-                                        prev = etcdListeners.putIfAbsent(url,\n-                                                container = new ConcurrentHashMap<>());\n-                                        return prev != null ? prev : container;\n-                                    });\n-\n-                    /*\n-                     *  if we have no category watcher listener,\n-                     *  we find out the current listener or create one for the current category, put or get only once.\n-                     */\n-                    ChildListener childListener =\n-                            Optional.ofNullable(listeners.get(listener))\n-                                    .orElseGet(() -> {\n-                                        ChildListener watchListener, prev;\n-                                        prev = listeners.putIfAbsent(listener, watchListener = (parentPath, currentChildren) -> EtcdRegistry.this.notify(url, listener,\n-                                                toUrlsWithEmpty(url, parentPath, currentChildren)));\n-                                        return prev != null ? prev : watchListener;\n-                                    });\n-\n-                    etcdClient.create(path);\n-                    /*\n-                     * at the first time, we want to pull already category and then watch their direct children,\n-                     *  eg: /dubbo/interface/providers, /dubbo/interface/consumers and so on.\n-                     */\n-                    List<String> children = etcdClient.addChildListener(path, childListener);\n-                    if (children != null) {\n-                        urls.addAll(toUrlsWithEmpty(url, path, children));\n-                    }\n-                }\n-                notify(url, listener, urls);\n-            }\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to subscribe \" + url + \" to etcd \" + getUrl()\n-                    + \", cause: \" + (OptionUtil.isProtocolError(e)\n-                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\n-                    : e.getMessage()), e);\n-        }\n-    }\n-\n-    @Override\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        ConcurrentMap<NotifyListener, ChildListener> listeners = etcdListeners.get(url);\n-        if (listeners != null) {\n-            ChildListener etcdListener = listeners.get(listener);\n-            if (etcdListener != null) {\n-                // maybe url has many subscribed paths\n-                for (String path : toUnsubscribedPath(url)) {\n-                    etcdClient.removeChildListener(path, etcdListener);\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return etcdClient.isConnected();\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        super.destroy();\n-        try {\n-            etcdClient.close();\n-        } catch (Exception e) {\n-            logger.warn(\"Failed to close etcd client \" + getUrl() + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    protected String toRootDir() {\n-        if (root.startsWith(PATH_SEPARATOR)) {\n-            return root;\n-        }\n-        return PATH_SEPARATOR + root;\n-    }\n-\n-    protected String toRootPath() {\n-        return root;\n-    }\n-\n-    protected String toServicePath(URL url) {\n-        String name = url.getServiceInterface();\n-        if (ANY_VALUE.equals(name)) {\n-            return toRootPath();\n-        }\n-        return toRootDir() + PATH_SEPARATOR + URL.encode(name);\n-    }\n-\n-    protected String[] toCategoriesPath(URL url) {\n-        String[] categories;\n-        if (ANY_VALUE.equals(url.getParameter(CATEGORY_KEY))) {\n-            categories = new String[]{PROVIDERS_CATEGORY, CONSUMERS_CATEGORY, ROUTERS_CATEGORY, CONFIGURATORS_CATEGORY};\n-        } else {\n-            categories = url.getParameter(CATEGORY_KEY, new String[]{DEFAULT_CATEGORY});\n-        }\n-        String[] paths = new String[categories.length];\n-        for (int i = 0; i < categories.length; i++) {\n-            paths[i] = toServicePath(url) + PATH_SEPARATOR + categories[i];\n-        }\n-        return paths;\n-    }\n-\n-    protected String toCategoryPath(URL url) {\n-        return toServicePath(url) + PATH_SEPARATOR + url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY);\n-    }\n-\n-    protected String toUrlPath(URL url) {\n-        return toCategoryPath(url) + PATH_SEPARATOR + URL.encode(url.toFullString());\n-    }\n-\n-    protected List<String> toUnsubscribedPath(URL url) {\n-        List<String> categories = new ArrayList<>();\n-        if (ANY_VALUE.equals(url.getServiceInterface())) {\n-            String group = url.getParameter(GROUP_KEY, DEFAULT_ROOT);\n-            if (!group.startsWith(PATH_SEPARATOR)) {\n-                group = PATH_SEPARATOR + group;\n-            }\n-            categories.add(group);\n-            return categories;\n-        } else {\n-            categories.addAll(Arrays.asList(toCategoriesPath(url)));\n-        }\n-        return categories;\n-    }\n-\n-    protected List<URL> toUrlsWithoutEmpty(URL consumer, List<String> providers) {\n-        List<URL> urls = new ArrayList<>();\n-        if (providers != null && providers.size() > 0) {\n-            for (String provider : providers) {\n-                provider = URL.decode(provider);\n-                if (provider.contains(Constants.HTTP_SUBFIX_KEY)) {\n-                    URL url = URL.valueOf(provider);\n-                    if (UrlUtils.isMatch(consumer, url)) {\n-                        urls.add(url);\n-                    }\n-                }\n-            }\n-        }\n-        return urls;\n-    }\n-\n-    protected List<URL> toUrlsWithEmpty(URL consumer, String path, List<String> providers) {\n-        List<URL> urls = toUrlsWithoutEmpty(consumer, providers);\n-        if (urls == null || urls.isEmpty()) {\n-            int i = path.lastIndexOf('/');\n-            String category = i < 0 ? path : path.substring(i + 1);\n-            URL empty = consumer.setProtocol(EMPTY_PROTOCOL).addParameter(CATEGORY_KEY, category);\n-            urls.add(empty);\n-        }\n-        return urls;\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.etcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\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.remoting.etcd.ChildListener;\r\n+import org.apache.dubbo.remoting.etcd.Constants;\r\n+import org.apache.dubbo.remoting.etcd.EtcdClient;\r\n+import org.apache.dubbo.remoting.etcd.EtcdTransporter;\r\n+import org.apache.dubbo.remoting.etcd.StateListener;\r\n+import org.apache.dubbo.remoting.etcd.option.OptionUtil;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Arrays;\r\n+import java.util.List;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\r\n+import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\r\n+\r\n+\r\n+/**\r\n+ * Support for ectd3 registry.\r\n+ */\r\n+public class EtcdRegistry extends FailbackRegistry {\r\n+\r\n+    private final static int DEFAULT_ETCD_PORT = 2379;\r\n+\r\n+    private final static String DEFAULT_ROOT = \"dubbo\";\r\n+\r\n+    private final String root;\r\n+\r\n+    private final Set<String> anyServices = new ConcurrentHashSet<>();\r\n+\r\n+    private final ConcurrentMap<URL, ConcurrentMap<NotifyListener, ChildListener>> etcdListeners = new ConcurrentHashMap<>();\r\n+    private final EtcdClient etcdClient;\r\n+\r\n+    public EtcdRegistry(URL url, EtcdTransporter etcdTransporter) {\r\n+        super(url);\r\n+        if (url.isAnyHost()) {\r\n+            throw new IllegalStateException(\"registry address is invalid, actual: '\" + url.getHost() + \"'\");\r\n+        }\r\n+        String group = url.getParameter(GROUP_KEY, DEFAULT_ROOT);\r\n+        if (!group.startsWith(PATH_SEPARATOR)) {\r\n+            group = PATH_SEPARATOR + group;\r\n+        }\r\n+        this.root = group;\r\n+        etcdClient = etcdTransporter.connect(url);\r\n+\r\n+        etcdClient.addStateListener(state -> {\r\n+            if (state == StateListener.CONNECTED) {\r\n+                try {\r\n+                    recover();\r\n+                } catch (Exception e) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    protected static String appendDefaultPort(String address) {\r\n+        if (address != null && address.length() > 0) {\r\n+            int i = address.indexOf(':');\r\n+            if (i < 0) {\r\n+                return address + \":\" + DEFAULT_ETCD_PORT;\r\n+            } else if (Integer.parseInt(address.substring(i + 1)) == 0) {\r\n+                return address.substring(0, i + 1) + DEFAULT_ETCD_PORT;\r\n+            }\r\n+        }\r\n+        return address;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(URL url) {\r\n+        try {\r\n+            String path = toUrlPath(url);\r\n+            if (url.getParameter(DYNAMIC_KEY, true)) {\r\n+                etcdClient.createEphemeral(path);\r\n+                return;\r\n+            }\r\n+            etcdClient.create(path);\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to register \" + url + \" to etcd \" + getUrl()\r\n+                    + \", cause: \" + (OptionUtil.isProtocolError(e)\r\n+                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\r\n+                    : e.getMessage()), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnregister(URL url) {\r\n+        try {\r\n+            String path = toUrlPath(url);\r\n+            etcdClient.delete(path);\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to unregister \" + url + \" to etcd \" + getUrl() + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doSubscribe(URL url, NotifyListener listener) {\r\n+        try {\r\n+            if (ANY_VALUE.equals(url.getServiceInterface())) {\r\n+                String root = toRootPath();\r\n+\r\n+                /*\r\n+                 *  if we are interested in all interfaces,\r\n+                 *  find out the current container or create one for the url, put or get only once.\r\n+                 */\r\n+                ConcurrentMap<NotifyListener, ChildListener> listeners =\r\n+                        Optional.ofNullable(etcdListeners.get(url))\r\n+                                .orElseGet(() -> {\r\n+                                    ConcurrentMap<NotifyListener, ChildListener> container, prev;\r\n+                                    prev = etcdListeners.putIfAbsent(url, container = new ConcurrentHashMap<>());\r\n+                                    return prev != null ? prev : container;\r\n+                                });\r\n+\r\n+                /*\r\n+                 *  if we have no interface watcher listener,\r\n+                 *  find the current listener or create one for the current root, put or get only once.\r\n+                 */\r\n+                ChildListener interfaceListener =\r\n+                        Optional.ofNullable(listeners.get(listener))\r\n+                                .orElseGet(() -> {\r\n+                                    ChildListener childListener, prev;\r\n+                                    prev = listeners.putIfAbsent(listener, childListener = (parentPath, currentChildren) -> {\r\n+                                        /*\r\n+                                         *  because etcd3 does not support direct children watch events,\r\n+                                         *  we should filter not interface events. if we watch /dubbo\r\n+                                         *  and /dubbo/interface, when we put a key-value pair {/dubbo/interface/hello hello},\r\n+                                         *  we will got events in watching path /dubbo.\r\n+                                         */\r\n+                                        for (String child : currentChildren) {\r\n+                                            child = URL.decode(child);\r\n+                                            if (!anyServices.contains(child)) {\r\n+                                                anyServices.add(child);\r\n+                                                /*\r\n+                                                 *  if new interface event arrived, we watch their direct children,\r\n+                                                 *  eg: /dubbo/interface, /dubbo/interface and so on.\r\n+                                                 */\r\n+                                                subscribe(url.setPath(child).addParameters(INTERFACE_KEY, child,\r\n+                                                        CHECK_KEY, String.valueOf(false)), listener);\r\n+                                            }\r\n+                                        }\r\n+                                    });\r\n+                                    return prev != null ? prev : childListener;\r\n+                                });\r\n+\r\n+                etcdClient.create(root);\r\n+                /*\r\n+                 * at the first time, we want to pull already interface and then watch their direct children,\r\n+                 *  eg: /dubbo/interface, /dubbo/interface and so on.\r\n+                 */\r\n+                List<String> services = etcdClient.addChildListener(root, interfaceListener);\r\n+                for (String service : services) {\r\n+                    service = URL.decode(service);\r\n+                    anyServices.add(service);\r\n+                    subscribe(url.setPath(service).addParameters(INTERFACE_KEY, service,\r\n+                            CHECK_KEY, String.valueOf(false)), listener);\r\n+                }\r\n+            } else {\r\n+                List<URL> urls = new ArrayList<>();\r\n+                for (String path : toCategoriesPath(url)) {\r\n+\r\n+                    /*\r\n+                     *  if we are interested in special categories (providers, consumers, routers and so on),\r\n+                     *  we find out the current container or create one for the url, put or get only once.\r\n+                     */\r\n+                    ConcurrentMap<NotifyListener, ChildListener> listeners =\r\n+                            Optional.ofNullable(etcdListeners.get(url))\r\n+                                    .orElseGet(() -> {\r\n+                                        ConcurrentMap<NotifyListener, ChildListener> container, prev;\r\n+                                        prev = etcdListeners.putIfAbsent(url,\r\n+                                                container = new ConcurrentHashMap<>());\r\n+                                        return prev != null ? prev : container;\r\n+                                    });\r\n+\r\n+                    /*\r\n+                     *  if we have no category watcher listener,\r\n+                     *  we find out the current listener or create one for the current category, put or get only once.\r\n+                     */\r\n+                    ChildListener childListener =\r\n+                            Optional.ofNullable(listeners.get(listener))\r\n+                                    .orElseGet(() -> {\r\n+                                        ChildListener watchListener, prev;\r\n+                                        prev = listeners.putIfAbsent(listener, watchListener = (parentPath, currentChildren) -> EtcdRegistry.this.notify(url, listener,\r\n+                                                toUrlsWithEmpty(url, parentPath, currentChildren)));\r\n+                                        return prev != null ? prev : watchListener;\r\n+                                    });\r\n+\r\n+                    etcdClient.create(path);\r\n+                    /*\r\n+                     * at the first time, we want to pull already category and then watch their direct children,\r\n+                     *  eg: /dubbo/interface/providers, /dubbo/interface/consumers and so on.\r\n+                     */\r\n+                    List<String> children = etcdClient.addChildListener(path, childListener);\r\n+                    if (children != null) {\r\n+                        urls.addAll(toUrlsWithEmpty(url, path, children));\r\n+                    }\r\n+                }\r\n+                notify(url, listener, urls);\r\n+            }\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to subscribe \" + url + \" to etcd \" + getUrl()\r\n+                    + \", cause: \" + (OptionUtil.isProtocolError(e)\r\n+                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\r\n+                    : e.getMessage()), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        ConcurrentMap<NotifyListener, ChildListener> listeners = etcdListeners.get(url);\r\n+        if (listeners != null) {\r\n+            ChildListener etcdListener = listeners.get(listener);\r\n+            if (etcdListener != null) {\r\n+                // maybe url has many subscribed paths\r\n+                for (String path : toUnsubscribedPath(url)) {\r\n+                    etcdClient.removeChildListener(path, etcdListener);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return etcdClient.isConnected();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        super.destroy();\r\n+        try {\r\n+            etcdClient.close();\r\n+        } catch (Exception e) {\r\n+            logger.warn(\"Failed to close etcd client \" + getUrl() + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    protected String toRootDir() {\r\n+        if (root.startsWith(PATH_SEPARATOR)) {\r\n+            return root;\r\n+        }\r\n+        return PATH_SEPARATOR + root;\r\n+    }\r\n+\r\n+    protected String toRootPath() {\r\n+        return root;\r\n+    }\r\n+\r\n+    protected String toServicePath(URL url) {\r\n+        String name = url.getServiceInterface();\r\n+        if (ANY_VALUE.equals(name)) {\r\n+            return toRootPath();\r\n+        }\r\n+        return toRootDir() + PATH_SEPARATOR + URL.encode(name);\r\n+    }\r\n+\r\n+    protected String[] toCategoriesPath(URL url) {\r\n+        String[] categories;\r\n+        if (ANY_VALUE.equals(url.getParameter(CATEGORY_KEY))) {\r\n+            categories = new String[]{PROVIDERS_CATEGORY, CONSUMERS_CATEGORY, ROUTERS_CATEGORY, CONFIGURATORS_CATEGORY};\r\n+        } else {\r\n+            categories = url.getParameter(CATEGORY_KEY, new String[]{DEFAULT_CATEGORY});\r\n+        }\r\n+        String[] paths = new String[categories.length];\r\n+        for (int i = 0; i < categories.length; i++) {\r\n+            paths[i] = toServicePath(url) + PATH_SEPARATOR + categories[i];\r\n+        }\r\n+        return paths;\r\n+    }\r\n+\r\n+    protected String toCategoryPath(URL url) {\r\n+        return toServicePath(url) + PATH_SEPARATOR + url.getParameter(CATEGORY_KEY, DEFAULT_CATEGORY);\r\n+    }\r\n+\r\n+    protected String toUrlPath(URL url) {\r\n+        return toCategoryPath(url) + PATH_SEPARATOR + URL.encode(url.toFullString());\r\n+    }\r\n+\r\n+    protected List<String> toUnsubscribedPath(URL url) {\r\n+        List<String> categories = new ArrayList<>();\r\n+        if (ANY_VALUE.equals(url.getServiceInterface())) {\r\n+            String group = url.getParameter(GROUP_KEY, DEFAULT_ROOT);\r\n+            if (!group.startsWith(PATH_SEPARATOR)) {\r\n+                group = PATH_SEPARATOR + group;\r\n+            }\r\n+            categories.add(group);\r\n+            return categories;\r\n+        } else {\r\n+            categories.addAll(Arrays.asList(toCategoriesPath(url)));\r\n+        }\r\n+        return categories;\r\n+    }\r\n+\r\n+    protected List<URL> toUrlsWithoutEmpty(URL consumer, List<String> providers) {\r\n+        List<URL> urls = new ArrayList<>();\r\n+        if (providers != null && providers.size() > 0) {\r\n+            for (String provider : providers) {\r\n+                provider = URL.decode(provider);\r\n+                if (provider.contains(Constants.HTTP_SUBFIX_KEY)) {\r\n+                    URL url = URL.valueOf(provider);\r\n+                    if (UrlUtils.isMatch(consumer, url)) {\r\n+                        urls.add(url);\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+        return urls;\r\n+    }\r\n+\r\n+    protected List<URL> toUrlsWithEmpty(URL consumer, String path, List<String> providers) {\r\n+        List<URL> urls = toUrlsWithoutEmpty(consumer, providers);\r\n+        if (urls == null || urls.isEmpty()) {\r\n+            int i = path.lastIndexOf('/');\r\n+            String category = i < 0 ? path : path.substring(i + 1);\r\n+            URL empty = consumer.setProtocol(EMPTY_PROTOCOL).addParameter(CATEGORY_KEY, category);\r\n+            urls.add(empty);\r\n+        }\r\n+        return urls;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/etcd/EtcdRegistryFactory.java", "source2": "org/apache/dubbo/registry/etcd/EtcdRegistryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\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.etcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.remoting.etcd.EtcdTransporter;\n-\n-public class EtcdRegistryFactory extends AbstractRegistryFactory {\n-\n-    private EtcdTransporter etcdTransporter;\n-\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        return new EtcdRegistry(url, etcdTransporter);\n-    }\n-\n-    public void setEtcdTransporter(EtcdTransporter etcdTransporter) {\n-        this.etcdTransporter = etcdTransporter;\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.etcd;\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+import org.apache.dubbo.remoting.etcd.EtcdTransporter;\r\n+\r\n+public class EtcdRegistryFactory extends AbstractRegistryFactory {\r\n+\r\n+    private EtcdTransporter etcdTransporter;\r\n+\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        return new EtcdRegistry(url, etcdTransporter);\r\n+    }\r\n+\r\n+    public void setEtcdTransporter(EtcdTransporter etcdTransporter) {\r\n+        this.etcdTransporter = etcdTransporter;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java", "source2": "org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,206 +1,206 @@\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.etcd;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\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.ConcurrentHashSet;\n-import org.apache.dubbo.event.EventDispatcher;\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-import org.apache.dubbo.remoting.etcd.ChildListener;\n-import org.apache.dubbo.remoting.etcd.EtcdClient;\n-import org.apache.dubbo.remoting.etcd.EtcdTransporter;\n-import org.apache.dubbo.remoting.etcd.StateListener;\n-import org.apache.dubbo.remoting.etcd.option.OptionUtil;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import com.google.gson.Gson;\n-\n-import java.io.File;\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-\n-/**\n- * 2019-07-08\n- */\n-public class EtcdServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\n-\n-    private final static Logger logger = LoggerFactory.getLogger(EtcdServiceDiscovery.class);\n-\n-    private final String root = \"/services\";\n-\n-    private final Set<String> services = new ConcurrentHashSet<>();\n-    private final Map<String, ChildListener> childListenerMap = new ConcurrentHashMap<>();\n-\n-    EtcdClient etcdClient;\n-    EventDispatcher dispatcher;\n-\n-    @Override\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-        registerServiceWatcher(event.getServiceName());\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-\n-        EtcdTransporter etcdTransporter = ExtensionLoader.getExtensionLoader(EtcdTransporter.class).getAdaptiveExtension();\n-\n-        if (registryURL.isAnyHost()) {\n-            throw new IllegalStateException(\"Service discovery address is invalid, actual: '\" + registryURL.getHost() + \"'\");\n-        }\n-\n-        etcdClient = etcdTransporter.connect(registryURL);\n-\n-        etcdClient.addStateListener(state -> {\n-            if (state == StateListener.CONNECTED) {\n-                try {\n-                    recover();\n-                } catch (Exception e) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-        });\n-\n-        this.dispatcher = EventDispatcher.getDefaultExtension();\n-        this.dispatcher.addEventListener(this);\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        if (etcdClient != null && etcdClient.isConnected()) {\n-            etcdClient.close();\n-        }\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        try {\n-            String path = toPath(serviceInstance);\n-//            etcdClient.createEphemeral(path);\n-            etcdClient.putEphemeral(path, new Gson().toJson(serviceInstance));\n-            services.add(serviceInstance.getServiceName());\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to register \" + serviceInstance + \" to etcd \" + etcdClient.getUrl()\n-                    + \", cause: \" + (OptionUtil.isProtocolError(e)\n-                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\n-                    : e.getMessage()), e);\n-        }\n-    }\n-\n-    String toPath(ServiceInstance serviceInstance) {\n-        return root + File.separator + serviceInstance.getServiceName() + File.separator + serviceInstance.getHost()\n-                + \":\" + serviceInstance.getPort();\n-    }\n-\n-    String toParentPath(String serviceName) {\n-        return root + File.separator + serviceName;\n-    }\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        try {\n-            String path = toPath(serviceInstance);\n-            etcdClient.putEphemeral(path, new Gson().toJson(serviceInstance));\n-            services.add(serviceInstance.getServiceName());\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to register \" + serviceInstance + \" to etcd \" + etcdClient.getUrl()\n-                    + \", cause: \" + (OptionUtil.isProtocolError(e)\n-                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\n-                    : e.getMessage()), e);\n-        }\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        try {\n-            String path = toPath(serviceInstance);\n-            etcdClient.delete(path);\n-            services.remove(serviceInstance.getServiceName());\n-            this.serviceInstance = null;\n-        } catch (Throwable e) {\n-            throw new RpcException(\"Failed to unregister \" + serviceInstance + \" to etcd \" + etcdClient.getUrl() + \", cause: \" + e.getMessage(), e);\n-        }\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return Collections.unmodifiableSet(services);\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\n-        listener.getServiceNames().forEach(serviceName -> registerServiceWatcher(serviceName));\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) {\n-        List<String> children = etcdClient.getChildren(toParentPath(serviceName));\n-        if (CollectionUtils.isEmpty(children)) {\n-            return Collections.EMPTY_LIST;\n-        }\n-        List<ServiceInstance> list = new ArrayList<>(children.size());\n-        for (String child : children) {\n-            ServiceInstance serviceInstance = new Gson().fromJson(etcdClient.getKVValue(child), DefaultServiceInstance.class);\n-            list.add(serviceInstance);\n-        }\n-        return list;\n-    }\n-\n-\n-    protected void registerServiceWatcher(String serviceName) {\n-        String path = root + File.separator + serviceName;\n-        /*\n-         *  if we have no category watcher listener,\n-         *  we find out the current listener or create one for the current category, put or get only once.\n-         */\n-        ChildListener childListener =\n-                Optional.ofNullable(childListenerMap.get(serviceName))\n-                        .orElseGet(() -> {\n-                            ChildListener watchListener, prev;\n-                            prev = childListenerMap.putIfAbsent(serviceName, watchListener = (parentPath, currentChildren) ->\n-                                    dispatchServiceInstancesChangedEvent(serviceName));\n-                            return prev != null ? prev : watchListener;\n-                        });\n-\n-        etcdClient.create(path);\n-\n-        etcdClient.addChildListener(path, childListener);\n-    }\n-\n-    private void recover() throws Exception {\n-        // register\n-        if (serviceInstance != null) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"Recover application register: \" + serviceInstance);\n-            }\n-            register(serviceInstance);\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.etcd;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\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.ConcurrentHashSet;\r\n+import org.apache.dubbo.event.EventDispatcher;\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+import org.apache.dubbo.remoting.etcd.ChildListener;\r\n+import org.apache.dubbo.remoting.etcd.EtcdClient;\r\n+import org.apache.dubbo.remoting.etcd.EtcdTransporter;\r\n+import org.apache.dubbo.remoting.etcd.StateListener;\r\n+import org.apache.dubbo.remoting.etcd.option.OptionUtil;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import com.google.gson.Gson;\r\n+\r\n+import java.io.File;\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+\r\n+/**\r\n+ * 2019-07-08\r\n+ */\r\n+public class EtcdServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private final static Logger logger = LoggerFactory.getLogger(EtcdServiceDiscovery.class);\r\n+\r\n+    private final String root = \"/services\";\r\n+\r\n+    private final Set<String> services = new ConcurrentHashSet<>();\r\n+    private final Map<String, ChildListener> childListenerMap = new ConcurrentHashMap<>();\r\n+\r\n+    EtcdClient etcdClient;\r\n+    EventDispatcher dispatcher;\r\n+\r\n+    @Override\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+        registerServiceWatcher(event.getServiceName());\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+\r\n+        EtcdTransporter etcdTransporter = ExtensionLoader.getExtensionLoader(EtcdTransporter.class).getAdaptiveExtension();\r\n+\r\n+        if (registryURL.isAnyHost()) {\r\n+            throw new IllegalStateException(\"Service discovery address is invalid, actual: '\" + registryURL.getHost() + \"'\");\r\n+        }\r\n+\r\n+        etcdClient = etcdTransporter.connect(registryURL);\r\n+\r\n+        etcdClient.addStateListener(state -> {\r\n+            if (state == StateListener.CONNECTED) {\r\n+                try {\r\n+                    recover();\r\n+                } catch (Exception e) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+        });\r\n+\r\n+        this.dispatcher = EventDispatcher.getDefaultExtension();\r\n+        this.dispatcher.addEventListener(this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        if (etcdClient != null && etcdClient.isConnected()) {\r\n+            etcdClient.close();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        try {\r\n+            String path = toPath(serviceInstance);\r\n+//            etcdClient.createEphemeral(path);\r\n+            etcdClient.putEphemeral(path, new Gson().toJson(serviceInstance));\r\n+            services.add(serviceInstance.getServiceName());\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to register \" + serviceInstance + \" to etcd \" + etcdClient.getUrl()\r\n+                    + \", cause: \" + (OptionUtil.isProtocolError(e)\r\n+                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\r\n+                    : e.getMessage()), e);\r\n+        }\r\n+    }\r\n+\r\n+    String toPath(ServiceInstance serviceInstance) {\r\n+        return root + File.separator + serviceInstance.getServiceName() + File.separator + serviceInstance.getHost()\r\n+                + \":\" + serviceInstance.getPort();\r\n+    }\r\n+\r\n+    String toParentPath(String serviceName) {\r\n+        return root + File.separator + serviceName;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        try {\r\n+            String path = toPath(serviceInstance);\r\n+            etcdClient.putEphemeral(path, new Gson().toJson(serviceInstance));\r\n+            services.add(serviceInstance.getServiceName());\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to register \" + serviceInstance + \" to etcd \" + etcdClient.getUrl()\r\n+                    + \", cause: \" + (OptionUtil.isProtocolError(e)\r\n+                    ? \"etcd3 registry may not be supported yet or etcd3 registry is not available.\"\r\n+                    : e.getMessage()), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        try {\r\n+            String path = toPath(serviceInstance);\r\n+            etcdClient.delete(path);\r\n+            services.remove(serviceInstance.getServiceName());\r\n+            this.serviceInstance = null;\r\n+        } catch (Throwable e) {\r\n+            throw new RpcException(\"Failed to unregister \" + serviceInstance + \" to etcd \" + etcdClient.getUrl() + \", cause: \" + e.getMessage(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return Collections.unmodifiableSet(services);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\r\n+        listener.getServiceNames().forEach(serviceName -> registerServiceWatcher(serviceName));\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) {\r\n+        List<String> children = etcdClient.getChildren(toParentPath(serviceName));\r\n+        if (CollectionUtils.isEmpty(children)) {\r\n+            return Collections.EMPTY_LIST;\r\n+        }\r\n+        List<ServiceInstance> list = new ArrayList<>(children.size());\r\n+        for (String child : children) {\r\n+            ServiceInstance serviceInstance = new Gson().fromJson(etcdClient.getKVValue(child), DefaultServiceInstance.class);\r\n+            list.add(serviceInstance);\r\n+        }\r\n+        return list;\r\n+    }\r\n+\r\n+\r\n+    protected void registerServiceWatcher(String serviceName) {\r\n+        String path = root + File.separator + serviceName;\r\n+        /*\r\n+         *  if we have no category watcher listener,\r\n+         *  we find out the current listener or create one for the current category, put or get only once.\r\n+         */\r\n+        ChildListener childListener =\r\n+                Optional.ofNullable(childListenerMap.get(serviceName))\r\n+                        .orElseGet(() -> {\r\n+                            ChildListener watchListener, prev;\r\n+                            prev = childListenerMap.putIfAbsent(serviceName, watchListener = (parentPath, currentChildren) ->\r\n+                                    dispatchServiceInstancesChangedEvent(serviceName));\r\n+                            return prev != null ? prev : watchListener;\r\n+                        });\r\n+\r\n+        etcdClient.create(path);\r\n+\r\n+        etcdClient.addChildListener(path, childListener);\r\n+    }\r\n+\r\n+    private void recover() throws Exception {\r\n+        // register\r\n+        if (serviceInstance != null) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"Recover application register: \" + serviceInstance);\r\n+            }\r\n+            register(serviceInstance);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery", "comments": ["Ordering differences only"], "unified_diff": "@@ -1 +1 @@\n-etcd3=org.apache.dubbo.registry.etcd.EtcdServiceDiscovery\n+etcd3=org.apache.dubbo.registry.etcd.EtcdServiceDiscovery\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-etcd3/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-etcd3/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,144 +1,141 @@\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 6574 6364 333c 2f61  egistry-etcd3</a\n-00000540: 7274 6966 6163 7449 643e 0d0a 2020 3c76  rtifactId>..  <v\n-00000550: 6572 7369 6f6e 3e32 2e37 2e31 303c 2f76  ersion>2.7.10</v\n-00000560: 6572 7369 6f6e 3e0d 0a20 203c 6e61 6d65  ersion>..  <name\n-00000570: 3e24 7b70 726f 6a65 6374 2e61 7274 6966  >${project.artif\n-00000580: 6163 7449 647d 3c2f 6e61 6d65 3e0d 0a20  actId}</name>.. \n-00000590: 203c 6465 7363 7269 7074 696f 6e3e 5468   <description>Th\n-000005a0: 6520 6574 6364 3320 7265 6769 7374 7279  e etcd3 registry\n-000005b0: 206d 6f64 756c 6520 6f66 2044 7562 626f   module of Dubbo\n-000005c0: 2070 726f 6a65 6374 3c2f 6465 7363 7269   project</descri\n-000005d0: 7074 696f 6e3e 0d0a 2020 3c6c 6963 656e  ption>..  <licen\n-000005e0: 7365 733e 0d0a 2020 2020 3c6c 6963 656e  ses>..    <licen\n-000005f0: 7365 3e0d 0a20 2020 2020 203c 6e61 6d65  se>..      <name\n-00000600: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n-00000610: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n-00000620: 6d65 3e0d 0a20 2020 2020 203c 7572 6c3e  me>..      <url>\n-00000630: 6874 7470 3a2f 2f77 7777 2e61 7061 6368  http://www.apach\n-00000640: 652e 6f72 672f 6c69 6365 6e73 6573 2f4c  e.org/licenses/L\n-00000650: 4943 454e 5345 2d32 2e30 3c2f 7572 6c3e  ICENSE-2.0</url>\n-00000660: 0d0a 2020 2020 2020 3c64 6973 7472 6962  ..      <distrib\n-00000670: 7574 696f 6e3e 7265 706f 3c2f 6469 7374  ution>repo</dist\n-00000680: 7269 6275 7469 6f6e 3e0d 0a20 2020 203c  ribution>..    <\n-00000690: 2f6c 6963 656e 7365 3e0d 0a20 203c 2f6c  /license>..  </l\n-000006a0: 6963 656e 7365 733e 0d0a 2020 3c64 6570  icenses>..  <dep\n-000006b0: 656e 6465 6e63 6965 733e 0d0a 2020 2020  endencies>..    \n-000006c0: 3c64 6570 656e 6465 6e63 793e 0d0a 2020  <dependency>..  \n-000006d0: 2020 2020 3c67 726f 7570 4964 3e6f 7267      <groupId>org\n-000006e0: 2e61 7061 6368 652e 6475 6262 6f3c 2f67  .apache.dubbo</g\n-000006f0: 726f 7570 4964 3e0d 0a20 2020 2020 203c  roupId>..      <\n-00000700: 6172 7469 6661 6374 4964 3e64 7562 626f  artifactId>dubbo\n-00000710: 2d72 6567 6973 7472 792d 6170 693c 2f61  -registry-api</a\n-00000720: 7274 6966 6163 7449 643e 0d0a 2020 2020  rtifactId>..    \n-00000730: 2020 3c76 6572 7369 6f6e 3e24 7b70 726f    <version>${pro\n-00000740: 6a65 6374 2e70 6172 656e 742e 7665 7273  ject.parent.vers\n-00000750: 696f 6e7d 3c2f 7665 7273 696f 6e3e 0d0a  ion}</version>..\n-00000760: 2020 2020 3c2f 6465 7065 6e64 656e 6379      </dependency\n-00000770: 3e0d 0a20 2020 203c 6465 7065 6e64 656e  >..    <dependen\n-00000780: 6379 3e0d 0a20 2020 2020 203c 6772 6f75  cy>..      <grou\n-00000790: 7049 643e 6f72 672e 6170 6163 6865 2e64  pId>org.apache.d\n-000007a0: 7562 626f 3c2f 6772 6f75 7049 643e 0d0a  ubbo</groupId>..\n-000007b0: 2020 2020 2020 3c61 7274 6966 6163 7449        <artifactI\n-000007c0: 643e 6475 6262 6f2d 636f 6d6d 6f6e 3c2f  d>dubbo-common</\n-000007d0: 6172 7469 6661 6374 4964 3e0d 0a20 2020  artifactId>..   \n-000007e0: 2020 203c 7665 7273 696f 6e3e 247b 7072     <version>${pr\n-000007f0: 6f6a 6563 742e 7061 7265 6e74 2e76 6572  oject.parent.ver\n-00000800: 7369 6f6e 7d3c 2f76 6572 7369 6f6e 3e0d  sion}</version>.\n-00000810: 0a20 2020 203c 2f64 6570 656e 6465 6e63  .    </dependenc\n-00000820: 793e 0d0a 2020 2020 3c64 6570 656e 6465  y>..    <depende\n-00000830: 6e63 793e 0d0a 2020 2020 2020 3c67 726f  ncy>..      <gro\n-00000840: 7570 4964 3e6f 7267 2e61 7061 6368 652e  upId>org.apache.\n-00000850: 6475 6262 6f3c 2f67 726f 7570 4964 3e0d  dubbo</groupId>.\n-00000860: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n-00000870: 4964 3e64 7562 626f 2d72 656d 6f74 696e  Id>dubbo-remotin\n-00000880: 672d 6574 6364 333c 2f61 7274 6966 6163  g-etcd3</artifac\n-00000890: 7449 643e 0d0a 2020 2020 2020 3c76 6572  tId>..      <ver\n-000008a0: 7369 6f6e 3e24 7b70 726f 6a65 6374 2e70  sion>${project.p\n-000008b0: 6172 656e 742e 7665 7273 696f 6e7d 3c2f  arent.version}</\n-000008c0: 7665 7273 696f 6e3e 0d0a 2020 2020 3c2f  version>..    </\n-000008d0: 6465 7065 6e64 656e 6379 3e0d 0a20 203c  dependency>..  <\n-000008e0: 2f64 6570 656e 6465 6e63 6965 733e 0d0a  /dependencies>..\n-000008f0: 3c2f 7072 6f6a 6563 743e 0d0a            </project>..\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 6574  ubbo-registry-et\n+00000520: 6364 333c 2f61 7274 6966 6163 7449 643e  cd3</artifactId>\n+00000530: 0a20 203c 7665 7273 696f 6e3e 322e 372e  .  <version>2.7.\n+00000540: 3130 3c2f 7665 7273 696f 6e3e 0a20 203c  10</version>.  <\n+00000550: 6e61 6d65 3e24 7b70 726f 6a65 6374 2e61  name>${project.a\n+00000560: 7274 6966 6163 7449 647d 3c2f 6e61 6d65  rtifactId}</name\n+00000570: 3e0a 2020 3c64 6573 6372 6970 7469 6f6e  >.  <description\n+00000580: 3e54 6865 2065 7463 6433 2072 6567 6973  >The etcd3 regis\n+00000590: 7472 7920 6d6f 6475 6c65 206f 6620 4475  try module of Du\n+000005a0: 6262 6f20 7072 6f6a 6563 743c 2f64 6573  bbo project</des\n+000005b0: 6372 6970 7469 6f6e 3e0a 2020 3c6c 6963  cription>.  <lic\n+000005c0: 656e 7365 733e 0a20 2020 203c 6c69 6365  enses>.    <lice\n+000005d0: 6e73 653e 0a20 2020 2020 203c 6e61 6d65  nse>.      <name\n+000005e0: 3e41 7061 6368 6520 4c69 6365 6e73 652c  >Apache License,\n+000005f0: 2056 6572 7369 6f6e 2032 2e30 3c2f 6e61   Version 2.0</na\n+00000600: 6d65 3e0a 2020 2020 2020 3c75 726c 3e68  me>.      <url>h\n+00000610: 7474 703a 2f2f 7777 772e 6170 6163 6865  ttp://www.apache\n+00000620: 2e6f 7267 2f6c 6963 656e 7365 732f 4c49  .org/licenses/LI\n+00000630: 4345 4e53 452d 322e 303c 2f75 726c 3e0a  CENSE-2.0</url>.\n+00000640: 2020 2020 2020 3c64 6973 7472 6962 7574        <distribut\n+00000650: 696f 6e3e 7265 706f 3c2f 6469 7374 7269  ion>repo</distri\n+00000660: 6275 7469 6f6e 3e0a 2020 2020 3c2f 6c69  bution>.    </li\n+00000670: 6365 6e73 653e 0a20 203c 2f6c 6963 656e  cense>.  </licen\n+00000680: 7365 733e 0a20 203c 6465 7065 6e64 656e  ses>.  <dependen\n+00000690: 6369 6573 3e0a 2020 2020 3c64 6570 656e  cies>.    <depen\n+000006a0: 6465 6e63 793e 0a20 2020 2020 203c 6772  dency>.      <gr\n+000006b0: 6f75 7049 643e 6f72 672e 6170 6163 6865  oupId>org.apache\n+000006c0: 2e64 7562 626f 3c2f 6772 6f75 7049 643e  .dubbo</groupId>\n+000006d0: 0a20 2020 2020 203c 6172 7469 6661 6374  .      <artifact\n+000006e0: 4964 3e64 7562 626f 2d72 6567 6973 7472  Id>dubbo-registr\n+000006f0: 792d 6170 693c 2f61 7274 6966 6163 7449  y-api</artifactI\n+00000700: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000710: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n+00000720: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n+00000730: 7369 6f6e 3e0a 2020 2020 3c2f 6465 7065  sion>.    </depe\n+00000740: 6e64 656e 6379 3e0a 2020 2020 3c64 6570  ndency>.    <dep\n+00000750: 656e 6465 6e63 793e 0a20 2020 2020 203c  endency>.      <\n+00000760: 6772 6f75 7049 643e 6f72 672e 6170 6163  groupId>org.apac\n+00000770: 6865 2e64 7562 626f 3c2f 6772 6f75 7049  he.dubbo</groupI\n+00000780: 643e 0a20 2020 2020 203c 6172 7469 6661  d>.      <artifa\n+00000790: 6374 4964 3e64 7562 626f 2d63 6f6d 6d6f  ctId>dubbo-commo\n+000007a0: 6e3c 2f61 7274 6966 6163 7449 643e 0a20  n</artifactId>. \n+000007b0: 2020 2020 203c 7665 7273 696f 6e3e 247b       <version>${\n+000007c0: 7072 6f6a 6563 742e 7061 7265 6e74 2e76  project.parent.v\n+000007d0: 6572 7369 6f6e 7d3c 2f76 6572 7369 6f6e  ersion}</version\n+000007e0: 3e0a 2020 2020 3c2f 6465 7065 6e64 656e  >.    </dependen\n+000007f0: 6379 3e0a 2020 2020 3c64 6570 656e 6465  cy>.    <depende\n+00000800: 6e63 793e 0a20 2020 2020 203c 6772 6f75  ncy>.      <grou\n+00000810: 7049 643e 6f72 672e 6170 6163 6865 2e64  pId>org.apache.d\n+00000820: 7562 626f 3c2f 6772 6f75 7049 643e 0a20  ubbo</groupId>. \n+00000830: 2020 2020 203c 6172 7469 6661 6374 4964       <artifactId\n+00000840: 3e64 7562 626f 2d72 656d 6f74 696e 672d  >dubbo-remoting-\n+00000850: 6574 6364 333c 2f61 7274 6966 6163 7449  etcd3</artifactI\n+00000860: 643e 0a20 2020 2020 203c 7665 7273 696f  d>.      <versio\n+00000870: 6e3e 247b 7072 6f6a 6563 742e 7061 7265  n>${project.pare\n+00000880: 6e74 2e76 6572 7369 6f6e 7d3c 2f76 6572  nt.version}</ver\n+00000890: 7369 6f6e 3e0a 2020 2020 3c2f 6465 7065  sion>.    </depe\n+000008a0: 6e64 656e 6379 3e0a 2020 3c2f 6465 7065  ndency>.  </depe\n+000008b0: 6e64 656e 6369 6573 3e0a 3c2f 7072 6f6a  ndencies>.</proj\n+000008c0: 6563 743e 0a                             ect>.\n"}]}
