GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Adding low-level support for numbering styles. by jlovegren0 · Pull Request #582 · python-openxml/python-docx

Conversation

@jlovegren0

@jlovegren0 jlovegren0 commented Dec 1, 2018

Copy link
Copy Markdown

This PR addresses the issue with numbering styles identified on StackOverflow and issues #25 and #122 .

My proposal does not add API support for these issues, but it makes it easier to handle work-arounds for users who are familiar with the numbering system from ISO 29500.

Basically, I just define the following types in the oxml submodule:

CT_NumPicBullet
CT_AbstractNum
CT_LongHexNumber
ST_LongHexNumber
CT_MultiLevelType
ST_MultiLevelType
CT_Lvl
CT_NumFmt
ST_NumberFormat
CT_LevelSuffix
ST_LevelSuffix
CT_LevelText
CT_LvlLegacy
CT_Num

Once these are defined, and the appropriate declarations are added to oxml.__init__ so that the parser can recognize them, a user can use the methods exposed by the xmlchemy submodule.

The maintainer has commented in the past that that lag on creating support for numbering is that the standard itself is very byzantine (I agree 100%) and there are some tough design choices for crafting the API. My PR is basically setting up some very low-level support so that more capable developers can look into addressing this within the API.

I have no experience with Open Source projects so I will need help from other community members for qa/qc and testing of the code. However, I have added a detailed write-up to the documentation (contributor guide, numbering section). I'll also be posting a solution to the SE question.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
jlovegren0 added 8 commits November 25, 2018 11:32
@jlovegren0
First commit. Begin changes to numbering (analysis section) documenta…
ddbace2
…tion
@jlovegren0
Updated Developer Reference section of documentation w/r/t numbering …
821c155
…part. Discussing resolution to issues 25 and 122.
@jlovegren0
Added four new simple type definitions in oxml.simpletypes submodule.
aaa944c
@jlovegren0
Defined CT_LevelSuffix
978df4e
@jlovegren0
Added CT_MultiLevelType and CT_NumFmt
38eeed1
@jlovegren0
Added CT_LongHexNumber, CT_LvlLegacy, CT_LevelText and CT_NumPicBullet
c096cf1
@jlovegren0
Defined the remaining types.
bc00f82
@jlovegren0
Added example to contributor section.
f42f153
@LilyDreamZhao

LilyDreamZhao commented Dec 5, 2018

Copy link
Copy Markdown

I cannot understand your meaning,can you give some example?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Dec 6, 2018 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Author

I cannot understand your meaning,can you give some example?

@LilyDreamZhao there's a good example on StackOverflow of the kind of problem that my PR addresses.
https://stackoverflow.com/questions/23446268

Basically, the xmlchemy submodule makes it easy to add and manipulate XML elements, but it requires that the element types be pre-defined. So, for example, the master branch will parse the <w:abstractNum> tag, but it doesn't understand that it's of type CT_AbstractNum, so it's very difficult to make any changes to it within the API. And you need to make changes to it in order to handle numbered and bulleted lists properly.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0
Bring branch up to date with master, fix conflict
f6d393a
@Clorel

Clorel commented Feb 19, 2020

Copy link
Copy Markdown

It's a good PR but the example file code, doesn't work with your branch.
I don't look numbering.xml for the adding AbstractNum OxmElement but the result is not good :
image

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 26, 2020

Copy link
Copy Markdown

@jlovegren0 Do you know if scanny has reviewed this or plans on merging this PR?
@scanny

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Mar 26, 2020 via email

Copy link
Copy Markdown
Author
I haven't had any contact with him about it. I think he hasn't had time for the project lately, and my PR would take a bit of study to decide on merging it. Hopefully it gets some attention in the future.
…
On Thu, Mar 26, 2020 at 12:15:23PM -0700, nitinkhosla79 wrote: @jlovegren0 Do you know if scanny has reviewed this or plans on merging this PR? @scanny -- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: #582 (comment)
-- Jesse Lovegren
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 27, 2020

Copy link
Copy Markdown

I haven't had any contact with him about it. I think he hasn't had time for the project lately, and my PR would take a bit of study to decide on merging it. Hopefully it gets some attention in the future.
…
On Thu, Mar 26, 2020 at 12:15:23PM -0700, nitinkhosla79 wrote: @jlovegren0 Do you know if scanny has reviewed this or plans on merging this PR? @scanny -- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: #582 (comment)
-- Jesse Lovegren

@scanny Can you advise on this PR and what all is needed? We can help with testing/regression tests and if anything else is needed, please advise.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 28, 2020

Copy link
Copy Markdown

It's a good PR but the example file code, doesn't work with your branch.
I don't look numbering.xml for the adding AbstractNum OxmElement but the result is not good :
image

@jlovegren0 Do you have a working example to try? Can you please comment on the observation by @Clorel ?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Clorel

Clorel commented Mar 28, 2020

Copy link
Copy Markdown

the example comes from the last post on this topic : https://stackoverflow.com/questions/23446268
I have solved the problem with insert the numbering on the template file docx and manage in low level API the abstractNum/Numbering index with a constant hash index.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 28, 2020

Copy link
Copy Markdown

the example comes from the last post on this topic : https://stackoverflow.com/questions/23446268
I have solved the problem with insert the numbering on the template file docx and manage in low level API the abstractNum/Numbering index with a constant hash index.

@Clorel Great to hear! Are you saying that you are able use this API (in this PR and) made further edits to make it work? Would you be able to describe those or add here if @jlovegren0 is ok with that?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Clorel

Clorel commented Mar 28, 2020

Copy link
Copy Markdown

sorry, not this API, the default API from python docx, with the example function "list_number" from : #25.
I don't search why my example doesn't work because ... i didn't understand what these abstractnum were and deadline...

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 28, 2020

Copy link
Copy Markdown

sorry, not this API, the default API from python docx, with the example function "list_number" from : #25.
I don't search why my example doesn't work because ... i didn't understand what these abstractnum were and deadline...

@Clorel We tried that and that is not working for us. Infact, if the document is opened in libreoffice it shows nested list correctly but in word, it shows in 1 sequence. What change did you make there?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 28, 2020

Copy link
Copy Markdown

"manage in low level API the abstractNum/Numbering index with a constant hash index"
@Clorel Constant hash index - can you elaborate a bit or share a code snipped for same?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Mar 29, 2020 via email

Copy link
Copy Markdown
Author
@nitinkhosla79 thanks for following up on this. I ran the code from the SE post and indeed the document renders properly in LibreOffice, but not in MS Word. I should add that Google Docs also renders it properly. I don't know whether that means (a) my solution is slightly off, but LibreOffice and Google docs are more forgiving; or (b) MS Word departs from ISO 29500 in some way and my solution is correct w/r/t the standrd. My branch has notes at /docs/dev/analysis/features/numbering.rst that I made at the time I made the PR (I didn't have a Word license at the time). I'm interested in a work-around if @Clorel has found one for MS Word.
…
On Sat, Mar 28, 2020 at 3:12 PM nitinkhosla79 ***@***.***> wrote: "manage in low level API the abstractNum/Numbering index with a constant hash index" @Clorel <https://github.com/Clorel> Constant hash index - can you elaborate a bit or share a code snipped for same? — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ADFNSQMLHS3XTICAJ57WYILRJZKZ7ANCNFSM4GHUFOXQ> .
-- Jesse Lovegren
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 29, 2020 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

@jlovegren0 can you check section 17.9(in particular 17.9.10) in latest iso 29500 version - latest release in Feb 2020.
https://interoperability.blob.core.windows.net/files/MS-OI29500/%5bMS-OI29500%5d.pdf
There are few references on when restart will be ignored.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Clorel

Clorel commented Mar 29, 2020 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

`def set_numbering(doc, par, prev=None, num_fmt_style='none', level=0, suffix_text='%1)', int_start=None):
# https://stackoverflow.com/questions/23446268/python-docx-how-to-restart-list-lettering
# #852

# \!/ USE TEMPLATE NUMBERING.XML EMBEDDED FOR DONT NEED TO CREATE ABSTRACTNUM \!/
# use list_number for default use (abstract 0-9 single bullet and decimal %1.)

# API Low Level with numbering // abstractNum map embedded because can't create abstractNum with python-docx
# Use the map from template for take NumID.
# We need to wait ISSUE #852 integration on PYTHON-DOCX for a best integration

# Get numbering style enum
# https://docs.microsoft.com/fr-fr/dotnet/api/microsoft.office.interop.word.wdnotenumberstyle?view=word-pia

"""
    Function like Issue #25

    Parameters
    ----------
    doc : docx.document.Document
        The document to add the list into.
    par : docx.paragraph.Paragraph
        The paragraph to turn into a list item.
    prev : docx.paragraph.Paragraph or None
        The previous paragraph in the list. If specified, the numbering
        and styles will be taken as a continuation of this paragraph.
        If omitted, a new numbering scheme will be started.
    num_fmt_style : style of numbering (bullet, none, decimal, lowerRoman, upperRoman, lowerLetter, upperLetter,
    level : int
        The level of the paragraph within the outline. If ``prev`` is
        set, defaults to the same level as in ``prev``. Otherwise,
        defaults to zero.
    suffix_text : suffix of numbering " %1. or %1) "
    int_start : optionnal, if your reset numbering not starting by 1, you can submit your starting override
    """

def get_abstract_id_from_map_embedded(num_fmt, level_numbering, suffix):
    # Default 0-9 (use is single level if you don't want never reset/restart element count)
    # 0 abstractNum SingleLevel Decimal %1. Indent 5 Lvl 0
    # 1 abstractNum SingleLevel Decimal %1. Indent 4 Lvl 0
    # 2 abstractNum SingleLevel Decimal %1. Indent 3 Lvl 0
    # 3 abstractNum SingleLevel Decimal %1. Indent 2 Lvl 0
    # 4 abstractNum SingleLevel Bullet * Indent 4 Lvl 0
    # 5 abstractNum SingleLevel Bullet * Indent 3 Lvl 0
    # 6 abstractNum SingleLevel Bullet * Indent 2 Lvl 0
    # 7 abstractNum SingleLevel Decimal %1. Indent 1 Lvl 0
    # 8 abstractNum SingleLevel Bullet * Indent 1 Lvl 0

    # Embedded AbstractNum
    # 9 abstractNum multilevel upperRoman %N) Indent/Lvl * N
    # 10 abstractNum multilevel decimal %N. Indent/Lvl * N
    # 11 abstractNum multilevel decimal %N Indent/Lvl * N
    # 12 abstractNum multilevel decimal %N) Indent/Lvl * N

    # 13 abstractNum multilevel lowerLetter %N) Indent/Lvl * N
    # 14 abstractNum multilevel upperLetter %N) Indent/Lvl * N
    # 15 abstractNum multilevel upperLetter %N. Indent/Lvl * N
    # 16 abstractNum multilevel Hybrid from Personnal Use
    # 17 abstractNum multilevel Hybrid from Personnal Use (2 with true bullet word)

    # 18 abstractNum multilevel upperRoman %N. Indent/Lvl * N
    # 19 abstractNum multilevel lowerLetter %N. Indent/Lvl * N
    # 20 abstractNum multilevel lowerRoman %N. Indent/Lvl * N
    # 21 abstractNum multilevel lowerRoman %N) Indent/Lvl * N
    # 22 abstractNum multilevel Bullet * Indent/Lvl * N
    # 23 abstractNum multilevel none %N Indent/Lvl * N

    key_abstract_num = int()
    if num_fmt in ['lowerRoman', 'upperRoman', 'lowerLetter', 'upperLetter']:
        is_default_suffix = True
        if suffix != '%1)':
            is_default_suffix = False

        # Mapping
        if num_fmt == 'lowerRoman':
            if is_default_suffix is True:
                key_abstract_num = 21
            else:
                key_abstract_num = 20
        elif num_fmt == 'upperRoman':
            if is_default_suffix is True:
                key_abstract_num = 9
            else:
                key_abstract_num = 18
        elif num_fmt == 'lowerLetter':
            if is_default_suffix is True:
                key_abstract_num = 13
            else:
                key_abstract_num = 19
        elif num_fmt == 'upperLetter':
            if is_default_suffix is True:
                key_abstract_num = 15
            else:
                key_abstract_num = 14
    elif num_fmt == 'bullet':
        key_abstract_num = 22
        """
        # (restart never)
        # default embedded template from python-docx 
        if 0 <= level_numbering <= 3:
            # use singleLevel AbstractNum
            if level_numbering == 0:
                key_abstract_num = 8
            elif level_numbering == 1:
                key_abstract_num = 6
            elif level_numbering == 2:
                key_abstract_num = 5
            else:
                key_abstract_num = 4
        else:
            # use default Personnal use style for indent the rest
            key_abstract_num = 20
        """
    elif num_fmt == 'decimal':
        if suffix == '%1':
            key_abstract_num = 11
            """
            # (restart never)
            # default embedded template from python-docx
            if 0 <= level_numbering <= 4:
                # use singleLevel AbstractNum
                if level_numbering == 0:
                    key_abstract_num = 7
                elif level_numbering == 1:
                    key_abstract_num = 3
                elif level_numbering == 2:
                    key_abstract_num = 2
                elif level_numbering == 3:
                    key_abstract_num = 1
                else:
                    key_abstract_num = 0
            else:
                # use default Personal Use style for indent the rest
                key_abstract_num = 20
            """
        elif suffix == '%1)':  # Default suffix
            key_abstract_num = 12
        else:
            key_abstract_num = 10

    elif num_fmt == 'defaultPersonalUse':
        # defaultPersonalUse style
        key_abstract_num = 17
    elif num_fmt == 'none':
        # None style
        key_abstract_num = 23
    else:
        key_abstract_num = 22

    return key_abstract_num

# Reset list with new numId if need it
if (prev is None or
        prev._p.pPr is None or
        prev._p.pPr.numPr is None or
        prev._p.pPr.numPr.numId is None):

    numbering = doc.part.numbering_part.numbering_definitions._numbering
    # Compute the abstract ID first by style, then by num
    i_num = get_abstract_id_from_map_embedded(num_fmt_style, level, suffix_text)

    # Set the concrete numbering based on the abstract numbering ID
    num = numbering.add_num(i_num)

    # Define the new beginning of numbering count (Default 1)
    int_start_override = 1
    if int_start is not None:
        int_start_override = int_start

    # Make sure to override the abstract continuation property
    num.add_lvlOverride(ilvl=level).add_startOverride(int_start_override)

    # Extract the newly-allocated concrete numbering ID
    num = num.numId
else:
    # Get the previous concrete numbering ID
    num = prev._p.pPr.numPr.numId.val

par._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = num
par._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = level

pass`

and the xml content embedded :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:numbering xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14"> <w:abstractNum w:abstractNumId="0" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7C"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="C310EC42"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1800"/> </w:tabs> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="1" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7D"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="E4089024"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1440"/> </w:tabs> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="2" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7E"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="FB12693A"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber3"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1080"/> </w:tabs> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="3" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF7F"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="38441652"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber2"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="720"/> </w:tabs> <w:ind w:left="720" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="4" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF81"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="171AC3A4"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1440"/> </w:tabs> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="5" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF82"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="F3EAFDEC"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet3"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="1080"/> </w:tabs> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="6" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF83"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="3D1EFFD4"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet2"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="720"/> </w:tabs> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="7" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF88"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="D0A62B40"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:pStyle w:val="ListNumber"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="360"/> </w:tabs> <w:ind w:left="360" w:hanging="360"/> </w:pPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="8" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="FFFFFF89"/> <w:multiLevelType w:val="singleLevel"/> <w:tmpl w:val="29761A62"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:pStyle w:val="ListBullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:tabs> <w:tab w:val="num" w:pos="360"/> </w:tabs> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="9" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="0C647DA1"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="59BA9FDA"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="10" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="13753292"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="BCA24D4E"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="11" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="1A5A15D8"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="5C5242CE"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="12" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="257C4B1F"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="63DAFCC8"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="13" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="3B7F246B"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="96C6BA6C"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="14" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="3E46416B"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="51EC5CD2"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="15" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="51380F66"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="D7B24454"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperLetter"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="16" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="55196267"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="2FD0C538"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%2"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="357" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1077" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="w"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1797" w:hanging="357"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%7"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="17" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="5BB90EA0"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="98EAB322"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="decimal"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="18" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="5D9B56A1"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="F7F63982"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="upperRoman"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="19" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="615F4BDB"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="12162188"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerLetter"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="20" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="62051C66"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="CD3624A8"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%1."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%2."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%3."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%4."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%5."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%6."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%7."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%8."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%9."/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="21" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="668A7C24"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="A0DA66B6"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%1)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%2)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%3)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%4)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%5)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%6)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%7)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%8)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="lowerRoman"/> <w:lvlText w:val="%9)"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="22" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="692B6527"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="02584028"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="bullet"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:abstractNum w:abstractNumId="23" w15:restartNumberingAfterBreak="0"> <w:nsid w:val="72101706"/> <w:multiLevelType w:val="multilevel"/> <w:tmpl w:val="FA98295A"/> <w:lvl w:ilvl="0"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val="%1"/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="360" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="1"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="720" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="2"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1080" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="3"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1440" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="4"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="1800" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="5"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2160" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="6"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2520" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="7"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="2880" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> <w:lvl w:ilvl="8"> <w:start w:val="1"/> <w:numFmt w:val="none"/> <w:lvlText w:val=""/> <w:lvlJc w:val="left"/> <w:pPr> <w:ind w:left="3240" w:hanging="360"/> </w:pPr> <w:rPr> <w:rFonts w:hint="default"/> </w:rPr> </w:lvl> </w:abstractNum> <w:num w:numId="1"> <w:abstractNumId w:val="8"/> </w:num> <w:num w:numId="2"> <w:abstractNumId w:val="6"/> </w:num> <w:num w:numId="3"> <w:abstractNumId w:val="5"/> </w:num> <w:num w:numId="4"> <w:abstractNumId w:val="4"/> </w:num> <w:num w:numId="5"> <w:abstractNumId w:val="7"/> </w:num> <w:num w:numId="6"> <w:abstractNumId w:val="3"/> </w:num> <w:num w:numId="7"> <w:abstractNumId w:val="2"/> </w:num> <w:num w:numId="8"> <w:abstractNumId w:val="1"/> </w:num> <w:num w:numId="9"> <w:abstractNumId w:val="0"/> </w:num> <w:num w:numId="10"> <w:abstractNumId w:val="12"/> </w:num> <w:num w:numId="11"> <w:abstractNumId w:val="10"/> </w:num> <w:num w:numId="12"> <w:abstractNumId w:val="9"/> </w:num> <w:num w:numId="13"> <w:abstractNumId w:val="18"/> </w:num> <w:num w:numId="14"> <w:abstractNumId w:val="20"/> </w:num> <w:num w:numId="15"> <w:abstractNumId w:val="21"/> </w:num> <w:num w:numId="16"> <w:abstractNumId w:val="14"/> </w:num> <w:num w:numId="17"> <w:abstractNumId w:val="15"/> </w:num> <w:num w:numId="18"> <w:abstractNumId w:val="19"/> </w:num> <w:num w:numId="19"> <w:abstractNumId w:val="13"/> </w:num> <w:num w:numId="20"> <w:abstractNumId w:val="23"/> </w:num> <w:num w:numId="21"> <w:abstractNumId w:val="16"/> </w:num> <w:num w:numId="22"> <w:abstractNumId w:val="22"/> </w:num> <w:num w:numId="23"> <w:abstractNumId w:val="17"/> </w:num> <w:num w:numId="24"> <w:abstractNumId w:val="11"/> </w:num> </w:numbering>

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 29, 2020

Copy link
Copy Markdown

@jlovegren0 Did you get a chance to review that section or if it gave you any clues on whether something is missing for level/restart conditions?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Mar 29, 2020 via email

Copy link
Copy Markdown
Author
@nitinkhosla79 I'll have a chance to review it in a few hours. Thanks for the lead.
…
On Sun, Mar 29, 2020 at 6:27 PM nitinkhosla79 ***@***.***> wrote: @jlovegren0 <https://github.com/jlovegren0> Did you get a chance to review that section or if it gave you any clues on whether something is missing for level/restart conditions? — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ADFNSQLZXSOZNQ4IY2X374DRJ7KOZANCNFSM4GHUFOXQ> .
-- Jesse Lovegren
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Mar 30, 2020 via email

Copy link
Copy Markdown
Author
@nitinkhosla79 I think you are referring to Microsoft's publication MS-OI29500 which lists areas where the Word UA departs from normative ISO 29500 sections. The portion referring to 17.9.10 concerns numbering restart elements. It is not relevant to the issue we are seeing with the example code from the SE question. The issue is that Word is treating the `abstractNum` definition created with python-docx as though its `multiLevelType` was `singleLevel`. It faithfully applies the number format for level one, but ignores subsequent levels. I looked at XML for a multilevel list definition generated by Word. I can't find any clear discrepancies other than Word defining some optional elements (tmpl, nsid, tabs and indents). I don't have any ideas about why the behavior is off.
…
On Sun, Mar 29, 2020 at 6:34 PM Jesse Lovegren ***@***.***> wrote: @nitinkhosla79 I'll have a chance to review it in a few hours. Thanks for the lead. On Sun, Mar 29, 2020 at 6:27 PM nitinkhosla79 ***@***.***> wrote: > @jlovegren0 <https://github.com/jlovegren0> Did you get a chance to > review that section or if it gave you any clues on whether something is > missing for level/restart conditions? > > — > You are receiving this because you were mentioned. > Reply to this email directly, view it on GitHub > <#582 (comment)>, > or unsubscribe > <https://github.com/notifications/unsubscribe-auth/ADFNSQLZXSOZNQ4IY2X374DRJ7KOZANCNFSM4GHUFOXQ> > . > -- Jesse Lovegren
-- Jesse Lovegren
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@komawar

komawar commented Mar 31, 2020

Copy link
Copy Markdown

@Clorel I work with @nitinkhosla79 on the python-docx stuff. we are trying your script and observe that this works correctly for nested numbering however, when using bullets (completely or partly) the nesting does not work. (the list shows up as single indent level list not nested)

have you faced this issue?
also, can you please elaborate further on how to incorporate your numbering.xml file in the script or when saving the file?
when I try to use it, error is shown that word is unable to read, please check contents of the file.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@komawar

komawar commented Mar 31, 2020

Copy link
Copy Markdown

@jlovegren0 (like the above comment) did you face any issue with bulleting or nested/hybridnested numbering+bulleting?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nitinkhosla79

nitinkhosla79 commented Mar 31, 2020

Copy link
Copy Markdown

@jlovegren0 Can you point out on why list_number(by @Clorel ) is working? Is it because his abstractnum definition has "multileveltype" defined as "multilevel"?
If you have any pointers on where should we focus on, we can dig deep and explore that area. If we can solve using your APIs it will be great.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@komawar

komawar commented Apr 8, 2020 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

@jlovegren0 hi again,
I have some questions around usage of abstractnumId (or reuse of the same):

we are trying to use custom style definitions that have color, font, txtFmt, ind, hanging, values. however, restarts, start and hanging aren't what's expected. so, I was trying to create new abstractnumId and new numId associated with them (which are then tied back to styles).

However, to get back all of the style information to new abstract num ID is quite complex. We have to manually get these values and copy them to the new abstract num ID definition

for example: right now I'm using

num_xml = d.part.numbering_part.numbering_definitions._numbering
    abs_num = None
    for j in num_xml.abstractNum_lst:
        if j.abstractNumId == abs_num_elem.abstractNumId:
            abs_num = j

st = lvl.add_start()
st.val = abs_num.get_or_add_lvl().get_or_add_start().val

...
...

lvl.add_lvlRestart().val = 1

Would be really great if:

  1. (Best) we are able to modify the existing abstract num ID so that some of the above information like restart, start, hanging can be specified (other elements too as we see more complex styles)
  2. or a next better approach could be that we have a copy.deepcopy like functionality for abstract num Ids so that we do not have to copy all the data

Also, if I have to get all the level for an existing abstract numId, can I simply use:

lvl_lst = abs_num.get_or_add_lvl()

for i in lvl_lst:
    print (i.ilvl)

Can you point us in the right direction for this?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

jlovegren0 added 2 commits April 9, 2020 01:43
@jlovegren0
add one method to CT_AbstractNum
60e54d9
@jlovegren0
correct typo in prior commit
5a92d48
@jlovegren0

jlovegren0 commented Apr 9, 2020

Copy link
Copy Markdown
Author

@komawar I think what needs to be done is to elaborate the definitions in oxml/numbering.py. This takes a bit of care to make sure that it sticks to the style in the base code and is sufficiently "pythonic." I committed one change where you can look up an abstractNum by its definition. I.e.,

>>> d = docx.Document('test.docx')
>>> d.part.numbering_part.element.abstractNum_having_abstractNumId(3)
<CT_AbstractNum '<w:abstractNum>' at 0x7f96432db110>

I'll try to add other methods as time permits. Just let me know what would be most useful.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@komawar

komawar commented Apr 9, 2020

Copy link
Copy Markdown

@jlovegren0 I am trying to look into the styles API on python-docx and the best way to get style appears to be
d.styles.get_by_id(d.styles.get_style_id("List Number", STYP.PARAGRAPH), STYP.PARAGRAPH)
however that fetches _ParagraphStyle object. This is posing some challenges, so what would be the best way to fetch a basedOn value for the style and then fetch that style. I see a method base_style that gives what is required.

class CT_Style(BaseOxmlElement):
    name = ZeroOrOne('w:name', successors=_tag_seq[1:])
    basedOn = ZeroOrOne('w:basedOn', successors=_tag_seq[3:])
...
...
    @property
    def basedOn_val(self):
...
     @property
     def base_style(self):

How do we get this CT_Style style object rather than _ParagraphStyle? or do you recommend a better way to fetch base_style?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Apr 10, 2020 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Author

@komawar _ParagraphStyle is ultimately an instance of ElementProxy. It is aptly named, as it's just a proxy for an lxml element and you can access the lxml representation through its element attribute. So just use (I hard code for clarity)

S = d.styles.get_by_id("ListNumber",1)
e = S.element

Then e is a CT_Style object which is in turn an instance of BaseOxmlElement: an lxml element with some sugar provided by xmlchemy. So you can use the properties provided by xmlchemy as follows:

>>> e.basedOn.val
'Normal'

Note that there are numerous paragraph styles based on "Normal," so it's not possible to get a unique style by its basedOn element.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Apr 10, 2020

Copy link
Copy Markdown
Author

@komawar One other thing to note when working with paragraph styles is that the .docx OPC container does not contain all of the styles that are visible through the UI. There are built-in styles but the styles.xml file will only contain the ones actually used in the document, I think. The issue is discussed in the base package's documentation.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@komawar

komawar commented Apr 10, 2020

Copy link
Copy Markdown

@jlovegren0 thank you for the awesome tips!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@alsedev

alsedev commented Jun 17, 2020 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Hello @jlovegren0 and @komawar, @nitinkhosla79 and all contributing to the MS Word numbering nightmare. I do really appreciate all time you spend to solve these issues. I already read this page conversation and want to say "Thank you all!". I am working on a project and I need to generate several documents based on one template (a simple docx) and restart numbering for each new document (only for "Heading 1" and "Heading 2").

Can you please give some simple guide (python sample) to achieve that? Thank you again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@trannhutle

trannhutle commented Nov 14, 2020

Copy link
Copy Markdown

Hi @jlovegren0 and @komawar ,

Would you please showing me how to run your current nested list example. I am running on the version 0.8.10 and it has this issue. AttributeError: 'CT_Numbering' object has no attribute 'abstractNum_lst'. Would you mind showing me how to fix it. Thank you so much!

image

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Nov 14, 2020 via email

Copy link
Copy Markdown
Author
@trannhutle the nested list example only works if you install the branch that the pull request discussed in this thread is based on. As far as I can tell the developer has abandoned this project.
…
On Sat, Nov 14, 2020 at 05:11:37AM -0800, trannhutle wrote: Hi @jlovegren0 and @komawar , Would you please showing me how to run your current nested list example. I am running on the version 0.8.10 and it has this issue. `AttributeError: 'CT_Numbering' object has no attribute 'abstractNum_lst'`. Would you mind showing me how to fix it. Thank you so much! ![image](https://user-images.githubusercontent.com/14163032/99147669-e6162580-26d6-11eb-9e04-a236e3400175.png) -- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: #582 (comment)
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@WilliamWCYoung

WilliamWCYoung commented Dec 2, 2022

Copy link
Copy Markdown

What's the current state here? We have just come across this issue and it seems like this has become stale?

theonesean and leonkvas reacted with thumbs up emoji
All reactions
  • 👍 2 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@theonesean

theonesean commented Dec 2, 2022

Copy link
Copy Markdown

What's the current state here? We have just come across this issue and it seems like this has become stale?

Seconded.

@jlovegren0 @scanny -- do we have any updates here?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@jlovegren0

jlovegren0 commented Dec 2, 2022 via email

Copy link
Copy Markdown
Author
I had identified a resolution in my PR, though without any higher-level API changes. I have not been involved with any development efforts since 2020.
…
On Fri, Dec 2, 2022, 2:09 PM Sean Bailey ***@***.***> wrote: What's the current state here? We have just come across this issue and it seems like this has become stale? Seconded. @jlovegren0 <https://github.com/jlovegren0> @scanny <https://github.com/scanny> -- do we have any updates here? — Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ADFNSQJHXNMGHOF7ZV3SCX3WLJJRDANCNFSM4GHUFOXQ> . You are receiving this because you were mentioned.Message ID: ***@***.***>
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Ridhaa25

Ridhaa25 commented Sep 12, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Hi @jlovegren0 , @komawar

Thank you for your work on this. I have been working through the code snippets mentioned above. I have been hitting my head against the wall with restarting level 0 numbered list. Do you have a python code snippet that would achieve something like this:

  1. Some text
    1.1 Some text 1

Paragraph or heading section

  1. Some text
    1.1 Some text 1

Any help with this would be GREATLY appreciated.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@msbike

msbike commented Sep 13, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Hi @Ridhaa25,
I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).

class ParagraphExt:

    p = None

    def __init__(self, p: Paragraph):
        self.p = p

    def restart_numbering(self):
        """
        Restarting the numbering of paragraph
        """

        # Getting the abstract number of paragraph
        abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
            self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val

        # Add abstract number to numbering part and reset
        num = self.p.part.numbering_part.element.add_num(abstract_num_id)
        num.add_lvlOverride(ilvl=0).add_startOverride(1)

        # Get or add elements to paragraph
        p_pr = self.p._p.get_or_add_pPr()
        num_pr = p_pr.get_or_add_numPr()
        ilvl = num_pr.get_or_add_ilvl()
        ilvl.val = int("0")
        num_id = num_pr.get_or_add_numId()
        num_id.val = int(num.numId)

To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.

p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()

Hope that will help you.

zebulmace, lilixxs, rpradal, and Sandwhich253989 reacted with thumbs up emoji Ridhaa25, diggity801, zebulmace, catherinetam, GullyBurns, and Sandwhich253989 reacted with heart emoji
All reactions
  • 👍 4 reactions
  • ❤️ 6 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Ridhaa25

Ridhaa25 commented Sep 14, 2023

Copy link
Copy Markdown

Hi @msbike

Thanks so much for this. This is exactly what I was looking for. Much appreciated

msbike reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@diggity801

diggity801 commented Sep 27, 2023

Copy link
Copy Markdown

Thank you for

Hi @Ridhaa25, I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).

class ParagraphExt:

    p = None

    def __init__(self, p: Paragraph):
        self.p = p

    def restart_numbering(self):
        """
        Restarting the numbering of paragraph
        """

        # Getting the abstract number of paragraph
        abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
            self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val

        # Add abstract number to numbering part and reset
        num = self.p.part.numbering_part.element.add_num(abstract_num_id)
        num.add_lvlOverride(ilvl=0).add_startOverride(1)

        # Get or add elements to paragraph
        p_pr = self.p._p.get_or_add_pPr()
        num_pr = p_pr.get_or_add_numPr()
        ilvl = num_pr.get_or_add_ilvl()
        ilvl.val = int("0")
        num_id = num_pr.get_or_add_numId()
        num_id.val = int(num.numId)

To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.

p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()

Hope that will help you.

Thank you! This is what saved me.

msbike reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bmoore27

bmoore27 commented Oct 2, 2023

Copy link
Copy Markdown

@msbike This snippet causes the numbering to reset to 1 on every element...Am I missing something?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@scanny

scanny commented Oct 2, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

@bmoore27 There is some library code by @madphysicist described here and with code here that handles the grisly details of list-numbering. It might be worth looking at and perhaps using via his haggis library or just vendoring into your own code. His work is very solid.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@madphysicist

madphysicist commented Oct 3, 2023 via email

Copy link
Copy Markdown
Recent plug of the library code that shows a simple usecase: https://stackoverflow.com/q/77194722/2988730
…
On Mon, Oct 2, 2023, 16:24 Steve Canny ***@***.***> wrote: @bmoore27 <https://github.com/bmoore27> There is some library code by @madphysicist <https://github.com/madphysicist> described here <https://haggis.readthedocs.io/en/latest/api.html#haggis.files.docx.list_number> and with code here <https://gitlab.com/madphysicist/haggis/-/blob/master/src/haggis/files/docx.py?ref_type=heads#L486> that handles the grisly details of list-numbering. It might be worth looking at and perhaps using via his haggis library or just vendoring into your own code. — Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ABDHGMQBEP5OAPKGQHM4EQTX5MWH7AVCNFSM4GHUFOX2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCNZUGM3TQOBSGUYA> . You are receiving this because you were mentioned.Message ID: ***@***.***>
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@zebulmace

zebulmace commented Nov 17, 2023

Copy link
Copy Markdown

Hi @Ridhaa25, 你好 I solved this problem some months ago. I can't remember any detail but maybe following code snipping will help you. I extended the Paragraph class and implemented a new method called restarting_numbering( ).几个月前我解决了这个问题。我不记得任何细节,但也许以下代码截取会对您有所帮助。我扩展了 Paragraph 类并实现了一个名为 restarting_numbering( )的新方法。

class ParagraphExt:

    p = None

    def __init__(self, p: Paragraph):
        self.p = p

    def restart_numbering(self):
        """
        Restarting the numbering of paragraph
        """

        # Getting the abstract number of paragraph
        abstract_num_id = self.p.part.document.part.numbering_part.element.num_having_numId(
            self.p.style.element.get_or_add_pPr().get_or_add_numPr().numId.val).abstractNumId.val

        # Add abstract number to numbering part and reset
        num = self.p.part.numbering_part.element.add_num(abstract_num_id)
        num.add_lvlOverride(ilvl=0).add_startOverride(1)

        # Get or add elements to paragraph
        p_pr = self.p._p.get_or_add_pPr()
        num_pr = p_pr.get_or_add_numPr()
        ilvl = num_pr.get_or_add_ilvl()
        ilvl.val = int("0")
        num_id = num_pr.get_or_add_numId()
        num_id.val = int(num.numId)

To use this method you need to create an instance of this class with the normal Paragraph (here p) and call the method.要使用此方法,您需要使用普通的 Paragraph(此处为 p)创建此类的实例并调用该方法。

p_ext = ParagraphExtDocx(p)
p_ext.restart_numbering()

Hope that will help you.希望对你有所帮助。

thanks

etlweather and lilixxs reacted with thumbs up emoji
All reactions
  • 👍 2 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Airor4

Airor4 commented Jan 25, 2024

Copy link
Copy Markdown

Please consider implementing Ridhaa25's solution to the restart numbering problem. It being an actual feature in word leads me to believe that this would be the fitting place to implement it rather than all of us users' codebases.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@diggity801

diggity801 commented Jan 31, 2024 via email

Copy link
Copy Markdown
Yes this should be implemented. It is foundation functionality.
…
On Thu, Jan 25, 2024, 1:58 PM Baylor Maloney ***@***.***> wrote: Please consider implementing Ridhaa25's solution to the restart numbering problem. It being an actual feature in word leads me to believe that this would be the fitting place to implement it rather than all of us users' codebases. — Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AA76IIBYHWBXHHHYV6PLB6LYQLIPZAVCNFSM4GHUFOX2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJRGEYDMNBZGM3A> . You are receiving this because you commented.Message ID: ***@***.***>
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Blezz-tech

Blezz-tech commented Feb 7, 2024

Copy link
Copy Markdown

please, add this function

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@diggity801

diggity801 commented Feb 7, 2024 via email

Copy link
Copy Markdown
Agreed - why is this not being incorporated? I found it to be highly useful.
…
On Wed, Feb 7, 2024, 10:56 AM Blezz-tech ***@***.***> wrote: please, add this function — Reply to this email directly, view it on GitHub <#582 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/AA76IID34VZIK53VJLBIHFLYSPE7HAVCNFSM4GHUFOX2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TCOJTGI3DONRZGM4Q> . You are receiving this because you commented.Message ID: ***@***.***>
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@Skelmis Skelmis mentioned this pull request Sep 1, 2024
Support nested lists Skelmis/python-docx#1
Closed
This was referenced Aug 3, 2026
Add list numbering: read the effective number and restart numbering toxicphreAK/python-docx-ng#73
Closed
Check pull request comments and evaluate pulls toxicphreAK/python-docx-ng#13
Closed
@pseudosavant pseudosavant mentioned this pull request Sep 24, 2026
Add independent list instances and continuation paragraphs #1614
Draft
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

1 more reviewer
@komawar komawar komawar left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

18 participants

@jlovegren0 @LilyDreamZhao @Clorel @nitinkhosla79 @komawar @alsedev @trannhutle @WilliamWCYoung @theonesean @Ridhaa25 @msbike @diggity801 @bmoore27 @scanny @madphysicist @zebulmace @Airor4 @Blezz-tech
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.